Поиск по сайту:

Как использовать аргументы сборки Docker для настройки сборки образа


Механизм «сборки аргументов» Docker позволяет вам определять переменные среды, на которые можно ссылаться в вашем Dockerfile во время сборки образа. В отличие от обычных инструкций ENV, аргументы сборки отсутствуют в окончательном выходном изображении. Они предназначены для случаев, когда вы хотите настроить процесс сборки вместо созданных контейнеров.

Определение аргументов сборки

Вы определяете аргументы сборки внутри вашего Dockerfile, используя инструкции ARG:

ARG EXAMPLE_VAR
ARG DEMO_VAR

RUN echo $EXAMPLE_VAR

Два аргумента, EXAMPLE_VAR и DEMO_VAR, добавляются в сборку Dockerfile выше.

Вы устанавливаете значения доступных аргументов с помощью флага --build-arg для docker build. Повторите флаг несколько раз, чтобы охватить все аргументы, определенные в вашем Dockerfile:

docker build -t example-image:latest 
    --build-arg EXAMPLE_VAR=value1 
    --build-arg DEMO_VAR=value2 
    .

Сборка образца Dockerfile с помощью этой команды выдаст value1 на ваш терминал во время сборки. Переменная EXAMPLE_VAR становится доступной в среде сборки со значением value1. Компонент значения флага --build-arg является необязательным; опустив его, вы автоматически выберете значение переменной в вашей локальной среде оболочки.

Поскольку аргументы сборки не сохраняются в построенном образе, вы увидите пустую строку при запуске echo $EXAMPLE_VAR внутри контейнеров, созданных из example-image:latest. Переменные, на которые должны ссылаться работающие контейнеры, следует добавлять с помощью инструкций ENV и флагов сборки --env или -e.

Хотя их нет в финальном образе, аргументы сборки по-прежнему влияют на кеш сборки Docker. Изменение значения аргумента между сборками может привести к промахам кеша для инструкций, которые следуют за первой ссылкой на переменную. Определяющий оператор ARG не отвечает за аннулирование кеша.

FROM alpine:latest
ARG EXAMPLE_VAR

# Cache is not invalidated - arg hasn't been used
RUN example-command

# Build cache can't be used from this point onwards
RUN echo $EXAMPLE_VAR

Значения аргумента сборки по умолчанию

Инструкции ARG может быть присвоено значение по умолчанию для использования, когда не указан соответствующий флаг --build-arg:

ARG EXAMPLE_VAR=demo

Docker всегда будет предпочитать значение, заданное флагом --build-arg, когда оно доступно. Если он отсутствует, для EXAMPLE_VAR будет установлено значение demo в среде сборки. Это уменьшает количество флагов, которые необходимо указать при создании образа с аргументами, которые редко переопределяются.

Где можно использовать аргументы сборки?

На аргументы сборки можно ссылаться в инструкциях Dockerfile, которые следуют за ними. Они работают с большинством типов инструкций, включая команды RUN, выполняемые в промежуточных контейнерах сборки. На аргументы ссылаются так же, как и на переменные среды, используя синтаксис $EXAMPLE_VAR.

Инструкции ARG уникальны, поскольку они существенно влияют на сборку, но их можно использовать перед инструкциями FROM. Разрешается ссылаться на аргументы сборки внутри инструкции FROM, что позволяет выбрать другой базовый образ в зависимости от конфигурации пользователя:

ARG BASE_IMAGE_VERSION=alpine
FROM my-app-base:2-${BASE_IMAGE_VERSION}
docker build -t my-app:latest --build-arg BASE_IMAGE_VERSION=debian .

Аргументы сборки доступны из строки, в которой они определены. Любая следующая инструкция может ссылаться на значение аргументов сборки, созданных над ней в Dockerfile. Вы должны добавить инструкции ARG для всех аргументов сборки, которые вы будете использовать. Ссылка на аргумент до того, как он был определен, или использование --build-arg без соответствующего ARG приведет к пустой строке.

Аргументы сборки не работают на разных этапах сборки. Каждый этап действует как новая сборка с собственным набором аргументов сборки. Инструкции ARG, включенные в предыдущие этапы, не влияют на более поздние, если только они не повторяются на каждом этапе:

FROM php:latest
ARG BUILD_VERSION

FROM composer:latest
ARG BUILD_VERSION

Оба этапа явно определяют аргумент BUILD_VERSION, поэтому значение, установленное с помощью --build-arg, будет предоставлено каждому из них.

Соображения, касающиеся этапа сборки, также применимы, когда вы используете ARG перед инструкцией FROM. Эти аргументы существуют вне любой стадии сборки; они используются всеми операторами FROM, но на них нельзя ссылаться, следуя инструкциям. Если вы хотите повторно использовать аргумент сборки уровня FROM внутри этапа, повторите инструкцию ARG, чтобы получить его значение:

# Only applies to FROM instructions
ARG BASE_IMAGE_VERSION=alpine
FROM my-app-base:2-${BASE_IMAGE_VERSION}

# Reference the outer build argument
ARG BASE_IMAGE_VERSION

# Works as expected
RUN echo $BASE_IMAGE_VERSION

Помимо этих особых проблем, аргументы ведут себя аналогично переменным среды во всех других отношениях. Вы можете переопределить их значения с помощью инструкций ARG и ENV, интерполировать их в строки и использовать в выражениях расширения вида $ {EXAMPLE_VAR:-demo . Это выбирает demo в качестве значения, когда переменная EXAMPLE_VAR не установлена.

Предопределенные аргументы сборки

Docker по умолчанию поддерживает некоторые аргументы сборки, даже если вы не включили их инструкции ARG в свой Dockerfile. Они связаны с настройками прокси и работают всякий раз, когда используется соответствующий флаг --build-arg. Переменные также исключаются из вывода docker history, чтобы избежать раскрытия потенциально конфиденциальных сведений, для которых они предназначены — подробнее об этой команде и ее последствиях ниже.

Сборки, обрабатываемые серверной частью BuildKit, также могут получить доступ к нескольким другим предопределенным аргументам сборки. Они поставляются с автоматически введенными значениями. Список включает TARGETOS, TARGETARCH, TARGETPLATFORM и BUILDOS, BUILDARCH и BUILDPLATFORM и ряд других. Переменные описывают характеристики среды сборки и платформы, на которую нацелен новый образ.

Когда использовать аргументы сборки?

Аргументы сборки можно использовать для внедрения конфигурации в сборки образов Docker. Это способ динамически изменять окончательный образ без написания нескольких файлов Dockerfile.

Вы можете использовать этот механизм для изменения базового образа сборки, изменения команд, выполняемых инструкциями RUN, и предоставления изменяемых пользователем настроек, которые предоставляют параметры настройки изображения. Аргументы сборки имеют смысл для большинства значений, которые используются только в процессе сборки и которые вы не хотите жестко закодировать в своем Dockerfile.

В некоторых ситуациях следует использовать альтернативные подходы. Несмотря на удобство, аргументы сборки не идеальны для секретных данных, таких как токены и ключи аутентификации. Поскольку ARG — это инструкция Dockerfile, переменные и их значения видны при просмотре изображения с помощью команды docker history. Таким образом, любой, у кого есть доступ к вашему образу, может просмотреть ключи, использованные во время сборки.

Учетные данные, используемые для аутентификации процесса сборки в реестрах пакетов и репозиториях системы управления версиями, лучше всего предоставлять в виде секретов сборки BuildKit. Они предназначены для обработки конфиденциальной информации и монтируются в виде файлов в среду сборки, а не становятся инструкциями образа.

Краткое содержание

Аргументы сборки позволяют настраивать сборки образов Docker, используя комбинацию инструкций Dockerfile и аргументов командной строки во время сборки. В отличие от переменных среды, аргументы сборки недоступны для запущенных контейнеров, хотя они все еще видны в истории слоев изображения.

Аргумент сборки — правильный выбор для неконфиденциальных настраиваемых пользователем параметров, влияющих на процесс сборки. Вместо этого используйте переменную среды, если вы хотите показать значение в конечном изображении. Секреты BuildKit — лучший третий вариант для любых ценных данных, к которым ваша сборка должна получить доступ.