Docker Compose env_file, environment y .env: qué hace cada uno

Guía de env_file en Docker Compose

Docker Compose: env_file vs environment vs .env, explicado | We.Inc

Qué hacen env_file, environment y el archivo .env en Docker Compose, qué valor gana cuando chocan y cómo funciona la interpolación ${VAR:-default}, con un resolvedor.

En Docker Compose, env_file carga un archivo de líneas KEY=value en el contenedor de un servicio. El atributo environment define variables del contenedor en línea y gana a env_file cuando ambos usan la misma clave. El archivo .env junto a compose.yaml es distinto: Compose lo lee para rellenar los marcadores ${VAR} del propio YAML.

Tres formas de pasar variables a Compose

La confusión viene del nombre: un archivo llamado .env y un atributo llamado env_file parecen lo mismo, pero uno configura el archivo Compose y el otro configura un contenedor. Usa el resolvedor para ver qué fuente gana para una variable y luego prueba las formas de interpolación con una variable definida, vacía o sin definir.

Preguntas frecuentes

¿Qué diferencia hay entre env_file y environment?

Ambos meten variables en el contenedor de un servicio. env_file las lee de uno o varios archivos, environment las enumera en compose.yaml. Cuando la misma clave aparece en ambos, gana el valor de environment, aunque esté vacío.

¿Compose pasa mi archivo .env a los contenedores automáticamente?

No. El archivo .env del proyecto solo se usa para sustituir ${VAR} en el archivo Compose. Una variable llega a un contenedor solo cuando un servicio la nombra en environment, o carga el archivo con env_file.

¿Dónde busca Compose el archivo .env?

En el directorio del proyecto, que es la carpeta indicada con --project-directory, si no la carpeta del primer archivo -f, y si no tu carpeta actual. Usa --env-file para apuntar a otro archivo; si hay varios, los posteriores sobrescriben a los anteriores.

¿Las rutas de env_file son relativas al lugar donde ejecuto el comando?

No. Las rutas relativas de env_file se resuelven desde la carpeta que contiene el archivo Compose, así que el stack funciona desde donde lo arranques.

¿Qué pasa con ${VAR} cuando VAR no está definida?

Compose muestra una advertencia y la sustituye por una cadena vacía. Usa ${VAR:-fallback} para dar un valor por defecto, o ${VAR:?message} para detenerte con un error.

La lista de precedencia, de arriba abajo

Claves sin valor

Todas las formas de interpolación

Qué da cada forma para una VAR definida, vacía o sin definir

Archivos Compose que puedes copiar

env_file más overrides con environment

La configuración compartida viene de archivos; las entradas de environment ganan para las claves que nombran. El archivo local es opcional.

El .env del proyecto usado solo para interpolación

Estos dos valores rellenan marcadores en compose.yaml. Ninguno llega a un contenedor salvo que un servicio lo mencione.

Usar esos valores en compose.yaml

La etiqueta de la imagen y el puerto publicado vienen de .env; la contraseña debe estar definida o Compose se detiene con un mensaje claro.

Comprobar lo que Compose resolvió

config imprime el modelo final con todas las variables rellenadas; --environment enumera los valores usados en la sustitución.

¿Qué valor gana?

La variable APP_MODE está definida en los lugares marcados abajo.

Dónde está definida la variable

Valor

El contenedor recibe APP_MODE={v} de: {n}

No está definida en ningún sitio, así que APP_MODE no existe en el contenedor.

Probador de interpolación

Expresión

VAR está

definida pero vacía

Valor de VAR

Resultado: {v}

Resultado: una cadena vacía

Compose se detiene con el error: {v}

Resultado: una cadena vacía, y Compose muestra una advertencia

Empieza gratis · Sin tarjeta de crédito

Relacionado: Guías

Producto

Para quién es

Funciones

Recursos

Empresa

Mapa del sitio