¿Por qué necesito declarar env_file explícitamente en docker-compose.yml?

3 minutos de lectura

avatar de usuario
progonkpa

Extendí la imagen de WordPress para agregar XDebug, PHPUnit, composer y phpcs.

La raíz de mi proyecto se ve así:

docker-wordpress
    Dockerfile
docker-compose.yml
.env

docker-compose.yml:

version: '3.7'

services:
   db:
     image: mysql:5.7
     volumes:
       - ./docker-mysql/db_data:/var/lib/mysql
     restart: always
     ports:
       - "3306:3306"
     env_file: .env

   wordpress:
     depends_on:
       - db
     image: progonkpa/mywordpress
     ports:
       - "80:80"
       - "443:443"
     restart: always
     volumes:
       - ./src:/var/www/html
     env_file: .env

volumes:
    db_data:

Esta configuración funciona, pero solo porque agregué la declaración env_file explícitamente mientras pensaba que Docker seleccionaba el archivo automáticamente si seguía las convenciones correctas: archivo .env en la raíz.

De hecho, quiero eliminar las declaraciones env_file en docker-compose.yml pero luego me encuentro con algunos problemas.

Registros del contenedor MySQL:

database is uninitialized and password option is not specified
You need to specify one of MYSQL_ROOT_PASSWORD

Parece que en la primera ejecución cuando se inicializan los contenedores, mis variables relacionadas con mysql no aparecen. El archivo .env contiene las variables habituales de WordPress y MySQL:

MYSQL_DATABASE=wordpress
MYSQL_USER=wordpress
MYSQL_PASSWORD=wordpress
MYSQL_ROOT_PASSWORD=wordpress
WORDPRESS_DB_HOST=db:3306
WORDPRESS_DB_USER=wordpress
WORDPRESS_DB_PASSWORD=wordpress

Entonces, ¿por qué mis variables no llegan a mi contenedor?

Hay dos lugares donde puede usar variables aquí: dentro del propio archivo de redacción y dentro de los contenedores creados pordocker-compose.

los .env El archivo será utilizado por docker-compose para ajustar el entorno de la docker-compose comando mismo. Esto es útil para las variables dentro del archivo yaml que deben expandirse, o las variables utilizadas por compose. Para más sobre esto último, ver los documentos de las variables de la CLI de composición.

Definición de un env_file dentro del yaml tomará las variables de entorno del archivo y las inyectará en el contenedor. Eso lo hace visible para su aplicación, pero no se puede usar para las variables dentro de su yaml que desea docker-compose expandirse ya que esa expansión variable ocurre antes que la env_file se analizan los contenidos.

Docker-compose debe definirse todo explícitamente, considérelo como un docker run parametersolo aplica esas configuraciones o parámetros en cada contenedor que se define en el archivo docker-compose.

Por lo tanto, se debe evitar anular ENV si ya están declarados en Dockerfile, por lo que es necesario definir explícitamente estas configuraciones por sí mismo.

cuando creamos la ventana acoplable, establecemos una configuración predeterminada en la imagen de la ventana acoplable, pero docker run command y docker-compose proporcione la funcionalidad para anular estos cambios que surtan efecto cuando la imagen se inicia como un contenedor.

Una definición de servicio contiene una configuración que se aplica a cada contenedor iniciado para ese servicio, de forma similar a pasar parámetros de línea de comandos para crear un contenedor acoplable. Del mismo modo, las definiciones de red y volumen son análogas a la creación de red acoplable y la creación de volumen acoplable.

componer archivo

archivo_env

Agregar variables de entorno desde un archivo. Puede ser un solo valor o una lista.

Si ha especificado un archivo Compose con docker-compose -f FILEcaminos en env_file son relativos al directorio en el que se encuentra el archivo.

Las variables de entorno declaradas en la sección de entorno anulan estos valores; esto es cierto incluso si esos valores están vacíos o no definidos.

env_file: .env

¿Ha sido útil esta solución?