Окружения dev и prod
Основной тип запуска проекта - через docker-compose. Запуск проекта может быть выполнен в одном
из двух окружений: development
или production
. Окружение управляется настройкой ENVIRONMENT
в
файле .env
:
ENVIRONMENT=development
Если настройка ENVIRONMENT
имеет значение production
, то при запуске используется файл
docker-compose.yml
. Если настройка ENVIRONMENT
имеет значение development
, то при
запуске используется дополнительный файл docker-compose.dev.yml
.
При запуске в режиме development
папка приложения src
монтируется как том, а каждый сервис
имеет expose
порты:
# docker-compose.dev.yml
x-base-dev-service: &base-dev-service
restart: "no"
services:
postgres:
<<: *base-dev-service
ports:
- ${POSTGRES_PORT}:5432
redis:
<<: *base-dev-service
ports:
- ${REDIS_PORT}:6379
Один Dockerfile для двух окружений
Стоит обратить внимание на Dockerfile
для Flask
приложения. Помимо multistage
сборки, данный файл
использует слои development
и production
в соответствии с
настройкой ENVIRONMENT
:
# ./docker/movies_auth/Dockerfile
ARG env=production
...
FROM final as development
FROM final as production
COPY ./src/${pckg_name} ./src/${pckg_name}
FROM ${env}
ENTRYPOINT ["./scripts/entrypoint.sh"]
Данная конфигурация позволяет использовать разные итоговые образы в зависимости от режима запуска. При запуске
в режиме development
папка приложения src монтируется как том в файле docker-compose.dev.yml,
поэтому слой development
в Dockerfile
пустой:
# ./docker/movies_auth/Dockerfile
...
FROM final as development
...
production
папка приложения src копируется с помощью инструкции COPY
:
# ./docker/movies_auth/Dockerfile
...
FROM final as production
COPY ./src/${pckg_name} ./src/${pckg_name}
env
:
# ./docker/python/Dockerfile
ARG env=production
...
FROM ${env}
Переменная env
в свою очередь передается как аргумент сборки:
# ./docker-compose.yml
services:
app:
build:
context: .
dockerfile: ./docker/movies_auth/Dockerfile
args:
- env=${ENVIRONMENT}
ENVIRONMENT
имеет
значение development
, то будет использован образ development
, а если production
, то production
.