Основной момент, который важно понять, — в
docker compose есть два уровня работы с переменными среды.1. Переменные хоста
Первый уровень — это переменные хоста. Их можно интерполировать в
compose.yaml (бывший docker-compose.yml), например:
services:
php:
image: php:${PHP_VERSION}-cli-bookworm
Если запустить
docker compose up без PHP_VERSION в среде, получим предупреждение, что такой переменной нет и была использована пустая строка. Дальше, конечно, ошибка: php:-cli-bookworm не является корректной ссылкой на образ.На уровне синтаксиса тут есть два основных варианта:
# задать значение по умолчанию
image: php:${PHP_VERSION:-8.5}-cli-bookworm
# или превратить предупреждение в ошибку с кастомным текстом
image: php:${PHP_VERSION:?Env variable `PHP_VERSION` is required}-cli-bookworm
Также на этом уровне можно использовать
.env файлы. По умолчанию docker compose ищет .env в текущей директории (pwd), затем в директории проекта (где compose.yaml).Можно явно указать несколько своих
.env файлов. Пример с классической схемой .env.local > .env, для отладки используем docker compose config --environment:
echo 'PHP_VERSION=8.4' > .env
echo 'PHP_VERSION=8.5' > .env.local
docker compose --env-file .env \
--env-file .env.local \
config --environment | grep PHP_VERSION
# выведет PHP_VERSION=8.5
Самый высокий приоритет всегда будет у реальных переменных среды:
export PHP_VERSION=8.6
docker compose --env-file .env \
--env-file .env.local \
config --environment | grep PHP_VERSION
# выведет PHP_VERSION=8.6
Про второй уровень, уровень контейнера, расскажу в следующем посте.
📁 Set, use, and manage variables in a Compose file with interpolation
📁 Environment variables precedence in Docker Compose
⸻
🐘 Кстати, этот пост я опубликовал в PHPeople ещё в прошлом году, присоединяйся!