Как передать динамические значения при сборке Docker-образа

«Как передать динамические значения при сборке Docker-образа» — вопрос из категории Docker, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для передачи динамических значений в Dockerfile используются инструкции ARG (аргументы сборки). Их значения задаются во время вызова docker build с помощью флага --build-arg.

Пример Dockerfile:

FROM alpine:latest
# Объявляем аргумент с возможным значением по умолчанию
ARG APP_VERSION=latest
ARG BUILD_ENV=production

# ARG-переменные доступны на этапе сборки (RUN)
RUN echo "Сборка версии ${APP_VERSION} для окружения ${BUILD_ENV}" && 
    apk add --no-cache some-package-${APP_VERSION}

# Чтобы использовать значение в runtime, его нужно передать через ENV
ENV APP_VERSION=${APP_VERSION}

Сборка с передачей аргументов:

docker build 
  --build-arg APP_VERSION=2.5.0 
  --build-arg BUILD_ENV=staging 
  -t myapp:latest .

Ключевые моменты:

  • Область видимости: ARG переменные доступны только на этапе build (в инструкциях RUN). Они не сохраняются в итоговом образе.
  • Многоэтапные сборки: ARG нужно объявлять заново в каждом этапе (stage), где они требуются.
  • Предопределенные ARG: Docker предоставляет несколько предопределенных аргументов, таких как HTTP_PROXY, которые также можно передавать через --build-arg.
  • Безопасность: Не используйте ARG для передачи секретов (паролей, токенов), так как их значения видны в истории сборки. Для секретов используйте --secret (экспериментальная функция) или multi-stage build с копированием только результата.