Salta el contingut

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 -e i 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

docker run -d --name bd mysql:8.4
docker ps

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:

docker logs bd
[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.

docker rm bd

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):

docker logs -f bd

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:

docker exec -it bd mysql -u alumne -p botiga
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:

docker exec bd env
docker inspect --format '{{json .Config.Env}}' bd

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:

docker image inspect --format '{{json .Config.Env}}' mysql:8.4

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:

MYSQL_ROOT_PASSWORD=Sapalomera2026
MYSQL_DATABASE=botiga
MYSQL_USER=alumne
MYSQL_PASSWORD=alumne123
docker rm -f bd
docker run -d --name bd --env-file bd.env mysql:8.4

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:

docker rm -f bd
docker run -d --name bd --env-file bd.env -p 127.0.0.1:3306:3306 mysql:8.4

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

  1. Executeu postgres:17-alpine sense cap variable. Llegiu els logs i expliqueu per què s'atura.
  2. Consulteu la pàgina de la imatge a Docker Hub i arrenqueu-la amb un usuari alumne, contrasenya pròpia i una base de dades institut, fent servir un fitxer --env-file.
  3. Connecteu-vos amb docker exec -it NOM psql -U alumne institut, creeu una taula i inseriu-hi dues files.
  4. 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.

docker rm -f bd

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.