Как только вы сталкиваетесь с разворачиванием одного проекта на несколько окружений, моментально возникает необходимость использовать аргументы для сборки docker-контейнеров. Например, для разработки и тестирования нужно использовать одни лицензионные ключи, а для продакшена — другие. К счастью, сообщество Докера это предусмотрела и существует удобное решение этого вопроса.
Настройка аргументов в Dockerfile
Первым делом вносим правки в файл Dockerfile, сразу после секции FROM:
ARG NEWARG ARG ANOTHER_ARG=devault-value
И перечисляем какие аргументы могут приниматься во время сборки образа. Как видите, можно указать значения по-умолчанию, а можно и не указывать. Как хотите. Теперь эти аргументы можно указывать в описании контейнера, например, в директивах RUN:
RUN echo "${ANOTHER_ARG}" RUN echo ${ANOTHER_ARG} RUN echo $ANOTHER_ARG RUN echo "$ANOTHER_ARG"
Однако, аргумент не будет подставлен, если он используется в контексте одинарных кавычек:
RUN echo '${ANOTHER_ARG}' RUN echo '$ANOTHER_ARG'
Эти два варианта будут выполнены без подстановки.
Сборка и запуск контейнера с аргументами
Делается достаточно просто: через опцию —build-arg указывается аргумент в формате ключ=значение:
docker build --build-arg ANOTHER_ARG="new value"--build-arg ARG="value" .
Сборка с аргументами в docker-compose
В docker-compose аргументы нельзя передать из командной строки. Они должны передаваться через docker-comose.yml файл:
version: "3" services: app: build: context: "." args: ANOTHER_ARG: "new value" ARG: "value"
А затем:
docker-compose up --build
Помимо аргументов, Docker поддерживает ещё и ENV переменные, у них чуть больше возможностей и они будут рассмотрены в других статьях.