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

В чем разница между ARG и ENV в Dockerfile?

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

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

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

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

Разница между ARG и ENV в Dockerfile

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

Основное отличие: время жизни и область видимости

Ключевое различие заключается в времени жизни переменных и их области виримости.

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

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

1. Инструкция ARG (Build-time variable)

  • Синтаксис: ARG <имя>[=<значение по умолчанию]>
  • Цель: Используется для параметризации процесса сборки. Например, для передачи версии программного пакета, который будет скачан и установлен во время docker build.
  • Передача значения: Значение можно передать через флаг --build-arg команды docker build.
  • Пример:
ARG APP_VERSION=1.0.0
FROM alpine:latest
RUN wget https://example.com/app-${APP_VERSION}.tar.gz

Для сборки с другой версией:

docker build --build-arg APP_VERSION=2.0.0 -t myapp .

2. Инструкция ENV (Runtime environment variable)

  • Синтаксис: ENV <ключ>=<значение> или ENV <ключ> <значение>
  • Цель: Установка переменных окружения внутри контейнера. Они используются приложением, работающим в контейнере (например, DATABASE_URL, LOG_LEVEL).
  • Передача значения: Значения можно переопределить при запуске контейнера с помощью флага -e команды docker run. Также они видны через команду docker inspect.
  • Пример:
FROM alpine:latest
ENV LOG_LEVEL=info \
    DATABASE_HOST=db.local
CMD ["/bin/myapp"]

Для запуска с другим уровнем логирования:

docker run -e LOG_LEVEL=debug myapp_container

Важные взаимодействия и особенности

  • ARG перед FROM: Инструкция ARG, объявленная перед первой инструкцией FROM, доступна только в этом контексте и может использоваться, например, для динамического выбора базового образа (FROM alpine:${ALPINE_VERSION}). Такие ARG не видны после FROM.
  • Использование ARG для установки ENV: Частая практика — использовать ARG для получения параметра сборки (например, версии), а затем фиксировать его как ENV в конечном образе, если это нужно приложению.
ARG BUILD_VERSION
FROM alpine:latest
ENV APP_VERSION=${BUILD_VERSION}
# APP_VERSION теперь будет доступна в запущенном контейнере
  • Переопределение ENV: Значение переменной ENV, установленной в Dockerfile, всегда можно переопределить при запуске контейнера, что делает конфигурацию очень гибкой.
  • Встроенные ARG: Docker предоставляет набор предопределенных ARG (например, DOCKER_REGISTRY), которые можно использовать без объявления.

Сводная таблица различий

КритерийARGENV
Этап доступностиТолько при сборке (docker build)При сборке и при запуске (docker run)
Сохраняется в образеНетДа (видно в docker inspect)
Передача значения--build-arg в docker build-e в docker run (переопределение)
Основная цельПараметризация сборки (версии, URL)Конфигурация запущенного приложения
Область видимостиОграничена этапом сборки, может быть локальной для конкретного FROMГлобальна для процессов в контейнере

Таким образом, выбор между ARG и ENV зависит от того, когда и кому нужна переменная: если она требуется только для процесса построения образа (например, скриптам в RUN), используйте ARG. Если переменная необходима вашему приложению внутри работающего контейнера для своей конфигурации, используйте ENV.

В чем разница между ARG и ENV в Dockerfile? | PrepBro