Docker совет №21: Использование переменных окружения
Apr 12, 2018 08:07 · 305 words · 2 minute read
Docker позволяет нам устанавливать переменные окружения как во время сборки docker-образов, так и во время запуска docker-контейнеров (к слову, при запуске также можно переопределять переменные указанные во время сборки). Давайте разберемся!
Рано или поздно наступит время, когда вам необходимо будет добавить переменную окружения к своему экземпляру docker-образа, и значение этой переменной должно отличаться в зависимости от того, где собирается образ. Конечно же, каждый раз редактировать Dockerfile
, меняя это значение, и пересобирать образ - не вариант. Еще может потребоваться заменить значение переменной во время запуска docker-контейнера из собранного образа.
Добавим в Dockerfile
пару новых инструкций, например:
FROM alpine:3.7
ARG APP_ENV=production
ENV APP_ENV="${APP_ENV}"
Вместо APP_ENV
вы можете написать RAILS_ENV
, NODE_ENV
или любую другую переменную окружения, значение которой вы хотите установить во время сборки docker-образа.
Названия переменных которые используются в инструкциях ARG
и ENV
не обязательно должны совпадать, но я советую для удобства делать их одинаковыми. В приведенном выше примере при запуске контейнера переменная окружения (APP_ENV
) по умолчанию будет иметь значение, установленное в инструкции ARG
на этапе сборки docker-образа (production). Убедимся в этом:
# Обычная сборка docker-образа (build), запуск контейнера (run) и получение значения переменной:
docker build -t my_test_app .
docker run --rm my_test_app env | grep APP_ENV
> APP_ENV=production
Сборка docker-образа с переопределенным значением переменной с помощью параметра --build-arg
, запуск контейнера и получение значения переменной:
docker build -t my_test_app --build-arg APP_ENV=staging .
docker run --rm my_test_app env | grep APP_ENV
> APP_ENV=staging
Переопределение значения переменной окружения во время запуска контейнера выглядит так:
docker run --rm -e APP_ENV=development my_test_app env | grep APP_ENV
> APP_ENV=development
Если вы используете утилиту docker-compose, то конфигурационный файл docker-compose.yml
может выглядеть так:
version: "3"
services:
my_test_app:
build:
context: "."
args:
APP_ENV: "helloworld"
Теперь, если выполнить команду docker-compose up --build
и проверить переменные окружения в docker-контейнере, то можно увидеть APP_ENV=helloworld
- как и ожидалось, значение переменной соответствует тому, которое было установлено в конфигурационном файле.