Работа с build arguments в docker-compose и Dockerfile

Как только вы сталкиваетесь с разворачиванием одного проекта на несколько окружений, моментально возникает необходимость использовать аргументы для сборки 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 переменные, у них чуть больше возможностей и они будут рассмотрены в других статьях.