Docker Compose: передача переменных окружения из .env файла
Почему нельзя хранить пароли прямо в docker-compose.yml?
Когда вы указываете пароли от MySQL или секретные ключи API прямо в файле docker-compose.yml, возникает серьезный риск утечки: при отправке проекта в репозиторий GitHub или GitLab ваши секреты становятся доступны посторонним. Правильный и безопасный подход — выносить все конфиденциальные параметры в отдельный скрытый файл .env.
Пошаговая настройка файла .env в Docker Compose
- Создайте файл .env в папке проекта:
Файл должен находиться в том же каталоге, что и вашdocker-compose.yml.nano .env - Заполните переменные в формате КЛЮЧ=ЗНАЧЕНИЕ:
MYSQL_ROOT_PASSWORD=SuperSecretPass123 MYSQL_DATABASE=my_shop MYSQL_USER=shop_user MYSQL_PASSWORD=ShopUserPass456 PORT=8080 - Подключите переменные в docker-compose.yml:
version: '3.8' services: db: image: mysql:8.0 restart: always environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_DATABASE: ${MYSQL_DATABASE} MYSQL_USER: ${MYSQL_USER} MYSQL_PASSWORD: ${MYSQL_PASSWORD} ports: - "${PORT}:3306" - Запустите контейнеры:
Docker Compose автоматически найдет файлdocker compose up -d.envи подставит значения в конструкцию${...}.
Важно для безопасности: Обязательно добавьте строку .env в файл .gitignore, чтобы пароли случайно не попали в публичный репозиторий Git!
Частые вопросы (FAQ)
Нужно ли указывать кавычки для значений в файле .env?
Кавычки не обязательны, если в значении нет пробелов. Если пароль содержит пробелы или спецсимволы, возьмите его в двойные кавычки: `DB_PASS="p@ss word"`.
Как проверить, какие значения фактически подставились?
Выполните команду `docker compose config`. Она покажет итоговый сгенерированный YAML-файл со всеми подставленными паролями.
Что делать, если файл с переменными называется не .env, а prod.env?
Запускайте сборку с указанием флага: `docker compose --env-file prod.env up -d`.
В чем разница между environment и env_file в docker-compose?
`environment` передает переменные прямо в ОС контейнера, а блок `${VAR}` берет значения для сборщика Compose на хосте. Директива `env_file: .env` импортирует все переменные внутрь контейнера списком.