Pas 5 - Configurar amb variables d'entorn
NGINX arrenca sense que li diguem res. Una base de dades, en canvi, necessita saber com a mínim quina contrasenya ha de tenir l'administrador. Com que no configurarem res "a mà" dins del contenidor (recordeu que és efímer), la manera estàndard de configurar-lo és amb variables d'entorn en el moment de crear-lo.
Objectius del pas
- Diagnosticar per què un contenidor s'atura llegint-ne els logs.
- Passar configuració amb
-ei amb--env-file. - Trobar a la documentació de la imatge quines variables accepta.
- Connectar-se a un servei que s'executa en un contenidor.
5.1 Un contenidor que s'atura sol
El contenidor no apareix. Amb docker ps -a veureu que està Exited (1): ha acabat amb error. Quan un contenidor s'atura inesperadament, el primer que cal mirar sempre són els logs:
[ERROR] [Entrypoint]: Database is uninitialized and password option is not specified
You need to specify one of the following as an environment variable:
- MYSQL_ROOT_PASSWORD
- MYSQL_ALLOW_EMPTY_PASSWORD
- MYSQL_RANDOM_ROOT_PASSWORD
El missatge és clar: la imatge necessita una variable d'entorn per saber quina contrasenya posar a root.
5.2 Passar variables amb -e
docker run -d --name bd \
-e MYSQL_ROOT_PASSWORD=Sapalomera2026 \
-e MYSQL_DATABASE=botiga \
-e MYSQL_USER=alumne \
-e MYSQL_PASSWORD=alumne123 \
mysql:8.4
La barra invertida
La \ al final de línia només serveix per partir una comanda llarga en diverses línies al terminal (a PowerShell és l'accent greu `). És equivalent a escriure-ho tot en una sola línia.
Ara el contenidor continua en marxa. Seguiu els logs fins que aparegui ready for connections (la primera arrencada triga uns segons perquè ha d'inicialitzar la base de dades):
L'script d'arrencada de la imatge ha llegit les variables i ha creat la contrasenya de root, la base de dades botiga i l'usuari alumne. Comproveu-ho connectant-vos amb el client mysql que ja porta la mateixa imatge:
SHOW DATABASES;
CREATE TABLE productes (id INT PRIMARY KEY AUTO_INCREMENT, nom VARCHAR(50));
INSERT INTO productes (nom) VALUES ('Teclat'), ('Ratoli');
SELECT * FROM productes;
exit
Podeu veure les variables que té un contenidor:
5.3 On trobo quines variables accepta una imatge?
Cada imatge defineix les seves. La font de referència és la pàgina de la imatge a Docker Hub, a l'apartat Environment Variables:
- mysql:
MYSQL_ROOT_PASSWORD,MYSQL_DATABASE,MYSQL_USER,MYSQL_PASSWORD... - postgres:
POSTGRES_PASSWORD,POSTGRES_USER,POSTGRES_DB... - wordpress:
WORDPRESS_DB_HOST,WORDPRESS_DB_USER...
Les imatges també poden portar variables definides per defecte. Mireu-les amb:
5.4 Fitxers de variables: --env-file
Quan hi ha moltes variables, és més còmode posar-les en un fitxer. Creeu bd.env:
Contrasenyes i variables d'entorn
Les variables d'entorn són visibles per a qualsevol que pugui fer docker inspect, i els fitxers .env acaben sovint pujats a Git per error. Afegiu sempre els fitxers .env al .gitignore. En entorns de producció s'utilitzen mecanismes de secrets (Docker secrets, Kubernetes Secrets, gestors de claus), que veurem al bloc 2.
5.5 I si publiquem el port?
Podem combinar el que ja sabem. Per connectar-nos a MySQL des d'un client instal·lat a l'amfitrió (DBeaver, MySQL Workbench...), publiquem el port 3306:
Fixeu-vos que el lliguem a 127.0.0.1: una base de dades no s'hauria d'exposar mai a tota la xarxa si no és imprescindible.
Miniactivitat - Una base de dades PostgreSQL
- Executeu
postgres:17-alpinesense cap variable. Llegiu els logs i expliqueu per què s'atura. - Consulteu la pàgina de la imatge a Docker Hub i arrenqueu-la amb un usuari
alumne, contrasenya pròpia i una base de dadesinstitut, fent servir un fitxer--env-file. - Connecteu-vos amb
docker exec -it NOM psql -U alumne institut, creeu una taula i inseriu-hi dues files. - Elimineu el contenidor i torneu-lo a crear amb la mateixa comanda. Hi és la taula? Per què?
5.6 Neteja
No elimineu encara la imatge mysql:8.4: la farem servir al pas següent.
Resum del pas
| Comanda | Què fa |
|---|---|
docker logs NOM |
Primer recurs quan un contenidor s'atura sol |
-e VAR=valor |
Defineix una variable d'entorn al contenidor |
--env-file fitxer |
Carrega les variables d'un fitxer |
docker exec NOM env |
Mostra les variables d'un contenidor en marxa |
Següent pas: a la miniactivitat heu vist que en recrear la base de dades les dades desapareixen. Al Pas 6 les farem persistents amb volums.