Как передавать переменные окружения и конфигурацию в 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.urlSERVER_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.