Skip to content

Работа с переменными окружения в Docker

Переменные окружения (environment variables) — важнейшая часть конфигурации контейнеров Docker. Они позволяют передавать параметры, секреты, настройки и переключать окружения (dev/prod) без необходимости пересборки образа.


📦 Способы задания переменных окружения

1. Через флаг -e в docker run

docker run -e ENV=production -e DEBUG=false myapp

Можно также использовать синтаксис:

docker run --env ENV=production myapp


2. Через файл .env

Создаёшь файл .env:

ENV=production
DEBUG=false
API_KEY=supersecret

Подключаешь его:

docker run --env-file .env myapp

Файл должен быть в формате KEY=VALUE, без кавычек, пробелов вокруг =.


3. Через ENV в Dockerfile

FROM node:18-alpine

ENV ENV=production
ENV PORT=3000

CMD ["node", "app.js"]

📌 Значения, заданные в Dockerfile, могут быть переопределены при запуске через -e или --env-file.


4. Через ARG и ENV в Dockerfile (для сборки)

ARG VERSION
ENV APP_VERSION=$VERSION

И при сборке:

docker build --build-arg VERSION=1.2.3 -t myapp .

ARG — переменные для сборки образа, а ENV — переменные для работы контейнера.


📂 Просмотр переменных в контейнере

  1. Посмотреть все переменные окружения:

    docker exec myapp printenv
    

  2. Проверить конкретную:

    docker exec myapp env | grep ENV
    


🔐 Передача секретов

Хранение конфиденциальных данных в переменных:

docker run -e JWT_SECRET=myjwt -e DB_PASSWORD=superpass myapp

Рекомендуется использовать .env в .gitignore, чтобы не коммитить секреты.


💡 Распространённые переменные

Назначение Пример
Тип окружения ENV=production
Логирование DEBUG=true
Порты PORT=3000
API ключи API_KEY=abcdef12345
Настройка базы POSTGRES_USER=admin
Веб-серверы NODE_ENV=development

🧪 Практические сценарии

🧪 Переключение окружения без пересборки:

docker run -e ENV=development myapp

🔁 Мульти-среда (prod/dev/test)

# .env.dev
ENV=development
DEBUG=true

# .env.prod
ENV=production
DEBUG=false
docker run --env-file .env.prod myapp

🐳 Использование вместе с Compose

Если используешь docker-compose.yml, переменные также можно подставлять через ${VARNAME}:

environment:
  - ENV=${ENV}
  - API_KEY=${API_KEY}


🗃️ Использование переменных окружения с базами данных

Многие официальные Docker-образы баз данных позволяют задавать параметры через переменные окружения. Это удобный способ: - автоматизировать создание БД и пользователя, - передавать пароль без необходимости вручную конфигурировать систему, - использовать одинаковую структуру в разных средах.

📌 Примеры: PostgreSQL

docker run -d \
  -e POSTGRES_DB=mydatabase \
  -e POSTGRES_USER=myuser \
  -e POSTGRES_PASSWORD=mypassword \
  -v pgdata:/var/lib/postgresql/data \
  postgres:15-alpine
Переменная Описание
POSTGRES_DB Имя создаваемой БД
POSTGRES_USER Имя пользователя
POSTGRES_PASSWORD Пароль пользователя

📌 Примеры: MySQL

docker run -d \
  -e MYSQL_DATABASE=mydatabase \
  -e MYSQL_USER=myuser \
  -e MYSQL_PASSWORD=mypass \
  -e MYSQL_ROOT_PASSWORD=rootpass \
  mysql:8
Переменная Описание
MYSQL_DATABASE Имя создаваемой БД
MYSQL_USER Имя пользователя
MYSQL_PASSWORD Пароль пользователя
MYSQL_ROOT_PASSWORD Пароль root-пользователя

📌 Примеры: MongoDB

docker run -d \
  -e MONGO_INITDB_ROOT_USERNAME=admin \
  -e MONGO_INITDB_ROOT_PASSWORD=adminpass \
  mongo

🧠 Совет по безопасности

  • Никогда не коммить .env с паролями в git
  • Используй docker secrets или внешние менеджеры (Vault, AWS Secrets Manager) в продакшене

📚 Резюме

Способ Где используется Переопределяется?
-e / --env docker run ✅ Да
--env-file docker run, Compose ✅ Да
ENV в Dockerfile При сборке ✅ Да
ARG в Dockerfile Только на этапе сборки ❌ Нет