docker-переменная среды compose.yml в переменную среды php

#php #docker #environment-variables #environment

#php #docker #переменные среды #Окружающая среда

Вопрос:

Пытаюсь сделать следующее: Распространить значения среды из файла .env в значения среды php-файла.

Установите переменные MYSQL в файле .env.

 #cat .env
MYSQL_ROOT_PASSWORD=RootPassword
MYSQL_USER=gnf_user
MYSQL_PASSWORD=UserPassword
MYSQL_DATABASE=gnf_noah
MYSQL_HOST=db
  

Я бы хотел, чтобы это распространилось на мой контейнер. Итак, я делаю:

 #cat docker-compose.yml
version: "3.2"
services:
 www:
  build: . #Include Dockerfile in current directory
  ports:
  - "30001:80"
  - "30443:443"
  expose:
  - "80"
  - "443"
  volumes:
  - "var:/var/www/html/var/"
  environment:
   MYSQL_HOST: ${MYSQL_HOST}
   MYSQL_DATABASE: ${MYSQL_DATABASE}
   MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
   MYSQL_USER: ${MYSQL_USER}
   MYSQL_PASSWORD: ${MYSQL_PASSWORD}
  restart: always
  networks:
  - frontend
  - backend
  links:
  - db:db
# shortend for readability ;-)
  

Теперь, пытаясь в моем контейнере захватить эти значения:

 $db_host = getenv('MYSQL_HOST', true) ?: getenv('MYSQL_HOST');
$db_name = getenv('MYSQL_DATABASE', true) ?: getenv('MYSQL_DATABASE');
$db_user = getenv('MYSQL_USER', true) ?: getenv('MYSQL_USER');
$db_pwd  = getenv('MYSQL_PASSWORD', true) ?: getenv('MYSQL_PASSWORD');
  

Выдает пустые значения.

Я здесь на совершенно неправильной странице .. или мне нужен скрипт для установки этих значений во время сборки, например, в /docker-entrypoint-init.d» или что-то в этом роде?

(РЕДАКТИРОВАТЬ) Используемые файлы:

 drwxr-xr-x  2 root root  4096 Aug 16 18:54 conf
-rw-r--r--  1 root root  1406 Aug 17 17:17 docker-compose.yaml
-rw-r--r--  1 root root   992 Aug 17 19:31 Dockerfile
drwxr-xr-x  2 root root  4096 Aug 17 14:45 dump
-rw-r--r--  1 root root   125 Aug 17 07:06 .env
-rw-r--r--  1 root root 55799 Aug  6 20:10 install-php-extensions
drwxr-xr-x  2 root root  4096 Aug 13 08:36 mysql
drwxrwxr-x 25 root 1005  4096 Aug 18 05:40 www
  

Комментарии:

1. файл .env должен находиться в том же каталоге, что и файл docker-compose

2. все файлы находятся в одном каталоге. См. Редактирование

3. попробуйте запустить echo $MYSQL_HOST изнутри контейнера, ваша настройка должна сработать, возможно, что-то в коде php

Ответ №1:

Попробуйте использовать env_file в файле compose для ссылки на свой .env .

Вот минимальный пример:

 .
├── docker-compose.yml
├── Dockerfile
├── .env
└── index.php
  

Dockerfile

 FROM php:7.0-apache
COPY ./index.php /var/www/html/
  

index.php

 <?php
    $db_host = getenv('MYSQL_HOST', true) ?: getenv('MYSQL_HOST');
    $db_name = getenv('MYSQL_DATABASE', true) ?: getenv('MYSQL_DATABASE');
    $db_user = getenv('MYSQL_USER', true) ?: getenv('MYSQL_USER');
    $db_pwd  = getenv('MYSQL_PASSWORD', true) ?: getenv('MYSQL_PASSWORD');

    echo "db_host: {$db_host}<br>";
    echo "db_name: {$db_name}<br>";
    echo "db_user: {$db_user}<br>";
    echo "db_pwd: {$db_pwd}<br>";
?>
  

docker-compose.yml

 version: "3.2"
services:
 www:
  build: . 
  ports:
  - "30001:80"
  - "30443:443"
  env_file:
    - .env
  

.env

 MYSQL_ROOT_PASSWORD=RootPassword
MYSQL_USER=gnf_user
MYSQL_PASSWORD=UserPassword
MYSQL_DATABASE=gnf_noah
  

Создайте контейнер:

 docker-compose up -d --build
  

введите описание изображения здесь

Комментарии:

1. Я рад, что это произошло. Спасибо за ваш отзыв!

2. Таким образом, если я наберу http://localhost:30001/.env в браузере, я смогу увидеть файл env с паролями!

3. @VitoLipari, вы правы: очевидно, что этот файл обслуживается сервером apache, если скопирован в /www/html , и он там не нужен. Я обновил ответ, просто чтобы убедиться, что никто не копирует этот обрезанный код, не задумываясь о том, что вы сказали. Спасибо!

Ответ №2:

Чтобы создать переменные среды .env file’ непосредственно в контейнере, мы используем параметр конфигурации env_file в docker

например

 web:
  env_file:
    - .env
  

Это самый тонкий способ передать список переменных среды в контейнер.