Переменные среды в Docker ComposeРазобравшись с переменными уровня хоста, мы готовы обсудить второй уровень.
2. Переменные Docker-сервисаПо умолчанию сервис не получает никакие переменные среды с хоста. Мы можем их прокинуть, используя ключи
environment и
env_file.
environment можно оформить как объект:
php:
environment:
DB_HOST: postgres
STORAGE_PATH: ${STORAGE_PATH}
или как массив:
php:
environment:
- DB_HOST=postgres
- STORAGE_PATH=${STORAGE_PATH}
Тут возникает интересный момент со значениями по умолчанию. Допустим, в контейнере крутится приложение на Symfony, которое обрабатывает отсуствие переменной среды
STORAGE_PATH с использованием
процессоров:
$di->parameters()
->set(
'storage.default_path',
'%kernel.project_dir%/var/storage/%kernel.environment%',
);
$di->services()
->set(Storage::class)
->args([
'path' => env('STORAGE_PATH')
->default('storage.default_path')
]);
Если в
compose.yaml прописать
STORAGE_PATH=${STORAGE_PATH:?/app/var/storage/dev}, это будет не то же самое. Без значения по умолчанию тоже нельзя оставить переменную, иначе Docker выдаст предупреждение и присвоит переменной пустую строку.
Решение, конечно же, есть в документации, но его легко не заметить:
Environment variables can be declared by a single key (no value to equals sign). In this case Compose relies on you to resolve the value. If the value is not resolved, the variable is unset and is removed from the service container environment.
php:
environment:
- STORAGE_PATH: ${STORAGE_PATH}
+ STORAGE_PATH:
или
php:
environment:
- - STORAGE_PATH=${STORAGE_PATH}
+ - STORAGE_PATH
По сути, это самый верный и простой способ прокинуть переменные среды с хоста в контейнер "как есть".
У
env_file тоже есть несколько интересных нюансов. Например, начиная с Docker 2.24.0, можно объявлять необязательные файлы:
php:
env_file:
- path: .env # required by default
- path: .env.local
required: false
Сами env файлы по умолчанию парсятся в формате Docker: с интерполяцией
${}, двумя вариантами синтаксиса (
: и
=) и экранированием. Это можно выключить, задав файлу
format: raw.
В будущем обсудим, как укротить всю эту нереальную гибкость и выработать best practice.
📁
Документация по environment📁
Документация по env_file⸻
🐘 Кстати, этот пост я опубликовал в
PHPeople ещё в прошлом году, присоединяйся!