Gymterview
junior

Как передавать переменные окружения и конфигурацию в Docker-контейнер?

Переменные окружения — это основной механизм конфигурирования Docker-контейнеров, позволяющий менять поведение приложения без пересборки образа.

1. Через флаг -e при запуске

Пример
docker run -e SPRING_PROFILES_ACTIVE=prod \
           -e DB_PASSWORD=secret \
           my-spring-app

2. Через файл с переменными окружения

Пример
# .env файл
SPRING_PROFILES_ACTIVE=prod
DB_HOST=postgres
DB_PORT=5432
DB_PASSWORD=secret

docker run --env-file .env my-spring-app

3. Через ENV в Dockerfile (значения по умолчанию)

Пример
ENV SPRING_PROFILES_ACTIVE=dev
ENV JAVA_OPTS="-Xmx512m"

4. Через ARG + ENV (параметризация при сборке)

Пример
ARG APP_VERSION=1.0
ENV APP_VERSION=${APP_VERSION}
Пример
docker build --build-arg APP_VERSION=2.0 -t myapp .

5. Через Docker Compose

Пример
services:
  app:
    environment:
      SPRING_PROFILES_ACTIVE: prod
    env_file:
      - .env

6. Монтирование файлов конфигурации

Пример
docker run -v ./application-prod.yml:/app/config/application.yml my-spring-app

Как Spring Boot использует переменные окружения

Spring Boot автоматически маппит переменные окружения в свойства конфигурации через relaxed binding:

  • SPRING_DATASOURCE_URL -> spring.datasource.url
  • SERVER_PORT -> server.port
Пример
docker run -e SERVER_PORT=9090 \
           -e SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/mydb \
           -e SPRING_DATASOURCE_USERNAME=admin \
           -e SPRING_DATASOURCE_PASSWORD=secret \
           -p 9090:9090 \
           my-spring-app

Безопасность секретов

Никогда не храните секреты (пароли, токены, ключи) в Dockerfile через ENV или ARG — они будут видны в истории образа (docker history). Используйте переменные окружения при запуске, Docker secrets или внешние системы управления секретами (Vault, AWS Secrets Manager).

На собеседовании: перечислите способы от простого к сложному: -e флаг, --env-file, ENV в Dockerfile, Docker Compose environment. Обязательно упомяните relaxed binding в Spring Boot и проблему безопасности — секреты нельзя зашивать в Dockerfile.