← Назад к вопросам

Как передать аргументы внутрь Dockerfile?

1.3 Junior🔥 251 комментариев
#Docker и контейнеризация

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Передача аргументов в Dockerfile: механизмы и практика

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

Основные механизмы передачи аргументов

1. Инструкция ARG (аргументы сборки)

Инструкция ARG определяет переменные, которые передаются во время сборки образа (docker build). Они не сохраняются в итоговом образе и используются для параметризации этапа сборки.

В Dockerfile:

ARG APP_VERSION=latest
FROM alpine:${APP_VERSION}

ARG BUILD_USER=default_user
RUN echo "Building with user: ${BUILD_USER}"

Передача при сборке через командную строку:

docker build --build-arg APP_VERSION=3.14 --build-arg BUILD_USER=deployer -t myapp .

2. Инструкция ENV (переменные окружения)

Инструкция ENV устанавливает переменные окружения, которые сохраняются в итоговом образе и доступны как во время сборки, так и во время выполнения контейнера. Часто используется для настройки приложения.

В Dockerfile:

ENV NODE_ENV=production
ENV APP_PORT=3000

# Можно использовать ARG для установки ENV
ARG API_KEY
ENV API_KEY=${API_KEY}

Передача значений во время выполнения:

docker run -e NODE_ENV=development -e APP_PORT=8080 myapp

Практические сценарии использования

Сценарий 1: Безопасная передача секретов

Для передачи чувствительных данных (паролей, токенов) рекомендуется использовать строчно-ориентированные ARG или секреты Docker BuildKit:

С Docker BuildKit:

# syntax=docker/dockerfile:1
RUN --mount=type=secret,id=mysecret cat /run/secrets/mysecret

Сборка с передачей секрета:

DOCKER_BUILDKIT=1 docker build --secret id=mysecret,src=./secret.txt -t secureapp .

Сценарий 2: Многоэтапные сборки

В многоэтапных сборках ARG-переменные имеют область видимости в пределах каждого этапа:

# Первый этап: сборка
FROM alpine:latest as builder
ARG BUILD_FLAVOR=optimized
RUN echo "Building ${BUILD_FLAVOR} version" && \
    # ... команды сборки

# Второй этап: финальный образ
FROM alpine:latest
ARG BUILD_FLAVOR
ENV APP_FLAVOR=${BUILD_FLAVOR}
COPY --from=builder /app/output /app

Рекомендации и лучшие практики

  • Разделение ARG и ENV: Используйте ARG для параметров сборки (версий, путей), а ENV — для конфигурации runtime.
  • Значения по умолчанию: Всегда задавайте значения по умолчанию для ARG, чтобы сборка была воспроизводимой.
  • Безопасность: Никогда не используйте ARG для передачи секретов, если они могут попасть в историю слоев. Для секретов используйте механизм --secret BuildKit.
  • Очистка кэша: Изменение значений ARG инвалидирует кэш Docker для всех последующих инструкций.

Пример комплексного использования

# Определяем ARG с значениями по умолчанию
ARG PYTHON_VERSION=3.9-slim
ARG COMPANY_NAME=mycompany

# Используем ARG в FROM
FROM python:${PYTHON_VERSION}

# Устанавливаем переменные окружения
ENV COMPANY=${COMPANY_NAME}
ENV APP_HOME=/app

# Используем ARG в инструкциях RUN
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update && \
    apt-get install -y --no-install-recommends git && \
    apt-get clean

WORKDIR ${APP_HOME}
COPY . .

# Метаданные образа
LABEL maintainer="devops@${COMPANY_NAME}.com"

Сборка с кастомными параметрами:

docker build \
  --build-arg PYTHON_VERSION=3.10-alpine \
  --build-arg COMPANY_NAME=acme \
  -t custom-app:latest .

Эти механизмы позволяют создавать универсальные Dockerfile, которые можно адаптировать под разные окружения (development, staging, production) без изменения исходного кода Dockerfile, что является важным аспектом практики DevOps и CI/CD.