TGViewer
Пых Пых @phpyh · 7.86K subscribers
Post #919 6.04K
Переменные среды в 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 ещё в прошлом году, присоединяйся!
  • 👍 37
  • ❤ 14
  • 🤡 7
  • 🔥 6
More from @phpyh
  1. Sep 15, 2026Сейчас один человек с AI может выполнять работу целого IT-отдела. Только хуёво
  2. Sep 12, 2026Спасибо за заявки! Всем напишу в понедельник. Осталось 1 место.
  3. Sep 11, 2026Хардкорный курс асинхронного PHP https://hardcourse.ru/php/async
  4. Sep 11, 2026Ещё полчасика надо — сайт готов, расписываю программу! 🙏
  5. Sep 10, 2026Краткое содержание: завтра в 12:00 открываю набор на Хардкорный курс асинхронного PHP с уч…
  6. Sep 10, 2026Post #1011
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →