Почему мне нужно явно объявить env_file в docker-compose.yml? - PullRequest
0 голосов
/ 22 сентября 2019

Я расширил образ Wordpress, добавив XDebug, PHPUnit, composer & phpcs.

Мой корень проекта выглядит так:

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:

Эта конфигурация работает, но только потому, что я явно добавил объявление env_file, пока думал, что Docker автоматически подхватывает файл, если я следую правильным соглашениям: файл .env в корне.

Я действительно хочуудалите объявления env_file в docker-compose.yml, но затем я сталкиваюсь с некоторыми проблемами.

Журналы контейнеров MySQL:

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

Мне кажется, что при первом запуске, когда контейнеры инициализируются, мойпеременные, связанные с MySQL, не проходят.Файл .env содержит обычные переменные Wordpress и 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

Так почему же мои переменные не достигают моего контейнера?

Ответы [ 2 ]

1 голос
/ 22 сентября 2019

Здесь можно использовать переменные в двух местах: внутри самого файла compose и внутри контейнеров, созданных docker-compose.

Файл .env будет использоваться docker-compose для настройкисреда самой команды docker-compose.Это полезно для переменных внутри файла yaml, которые необходимо раскрыть, или для переменных, используемых самим compose.Подробнее о последнем см. составные переменные CLI docs .

Определение env_file внутри yaml будет принимать переменные окружения из файла и вставлять их в контейнер.Это делает его видимым для вашего приложения, но не может использоваться для переменных внутри вашего yaml, которые вы хотите расширить docker-compose, так как это расширение переменных происходит до того, как содержимое env_file будет проанализировано.

1 голос
/ 22 сентября 2019

Docker-compose нужно все явно определять, рассматривайте его как docker run parameter, он применяет только те конфигурации или параметры к каждому контейнеру, который определен в файле docker-compose.

Так что следуетизбегайте переопределения ENV, если они уже объявлены в Dockerfile, поэтому вам нужно явно определить эти конфигурации для себя.

когда мы собираем docker, мы устанавливаем некоторую конфигурацию по умолчанию в образе docker, но docker run command и docker-compose предоставляют возможность переопределять их, чтобы изменения вступили в силу при запуске образа в виде контейнера.

Определение службы содержит конфигурацию, которая применяется к каждому контейнеру, запущенному для этой службы,очень похоже на передачу параметров командной строки в контейнер Docker.Аналогично, определения сети и тома аналогичны созданию в Docker Network и созданию тома Docker.

compose-file

env_file

Добавление переменных окружения из файла.Может быть одним значением или списком.

Если вы указали файл Compose с помощью docker-compose -f FILE, пути в env_file относятся к каталогу, в котором находится файл.

Переменные среды, объявленные в разделе среды, переопределяют эти значения - это верно, даже если эти значения пусты или не определены.

env_file: .env
...