Variables de entorno con Compose
El problema de hardcodear valores en el YAML
Sección titulada «El problema de hardcodear valores en el YAML»services: db: image: postgres:16 environment: POSTGRES_PASSWORD: secreto123 # hardcodeado — termina en el repo si se versiona el YAMLSi docker-compose.yml se versiona en git (lo normal — es la definición del stack, no un secreto en sí), cualquier valor hardcodeado ahí queda en el historial del repo.
.env junto al docker-compose.yml
Sección titulada «.env junto al docker-compose.yml»Compose lee automáticamente un archivo .env en la misma carpeta que el docker-compose.yml, sin configuración extra:
POSTGRES_USER=userPOSTGRES_PASSWORD=secreto123POSTGRES_DB=miappAPP_PORT=3000services: app: build: . ports: - "${APP_PORT}:3000" environment: DATABASE_URL: postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}
db: image: postgres:16 environment: POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB}${VARIABLE} interpola el valor del .env al momento de leer el YAML — el archivo versionado (docker-compose.yml) no tiene ningún secreto adentro, solo referencias.
.env va en .gitignore
Sección titulada «.env va en .gitignore».envEl patrón recomendado: versionar un .env.example con las claves (sin valores reales) como documentación de qué variables hacen falta, y que cada quien copie su propio .env local:
POSTGRES_USER=POSTGRES_PASSWORD=POSTGRES_DB=APP_PORT=3000cp .env.example .env# completar valores reales en .envValor por defecto si la variable no está definida
Sección titulada «Valor por defecto si la variable no está definida»ports: - "${APP_PORT:-3000}:3000"${VAR:-default} usa default si VAR no está definida en el .env ni en el entorno de la shell — evita que Compose falle o quede con un valor vacío si alguien olvidó completar el .env.
Consideraciones
Sección titulada «Consideraciones»- La interpolación de Compose (
${VAR}) es distinta deenvironmentcon--env-filepasado adocker run— Compose interpola dentro del propio YAML; el.envde Compose sirve tanto para eso como para poblarenvironment:de cada servicio. - Si una variable hace falta en runtime dentro del contenedor (no solo en el YAML), tiene que estar además en la sección
environment:del servicio — el.envde Compose no se pasa automáticamente al contenedor sin declararla ahí.