ARG — это переменные, доступные только на этапе сборки образа во время docker build, в рантайме контейнера их не видно. ENV задаёт переменные окружения внутри образа и работающего контейнера, они доступны приложению при запуске. Обычно ARG используют для параметризации процесса сборки, а ENV — для настроек поведения приложения в рантайме.
И ARG, и ENV объявляются в Dockerfile, но используются на разных этапах жизненного цикла: ARG — во время сборки образа, ENV — во время работы контейнера.
ARG (build-time аргументы) доступны только внутри шагов сборки: в инструкциях FROM (в ограниченных случаях), RUN и других инструкциях во время выполнения docker build. После завершения сборки процессы внутри контейнера эти значения не видят, если их специально не перенесли в ENV или файлы.ARG переопределяются при сборке флагом --build-arg; их удобно использовать для выбора базового образа, установки доп. пакетов, конфигурации прокси, включения/отключения debug-инструментов именно на этапе сборки.ENV записывает переменные прямо в образ, и все контейнеры из этого образа видят их как обычные переменные окружения. При запуске контейнера значения ENV можно изменять через docker run -e или настройки в docker-compose.yml.ARG управляет тем, как собирается образ (что скачиваем, какие зависимости ставим), а ENV управляет тем, как ведёт себя уже собранное приложение (уровень логирования, URL сервисов, режим окружения и т.п.).ARG, и ENV попадают в историю слоёв образа и могут быть прочитаны тем, у кого есть доступ к образу, поэтому для секретов (пароли, токены) использовать их не стоит — лучше применять механизмы секретов сборки и рантайма.Если нужно, чтобы значение, известное на этапе сборки, было доступно и в рантайме, его явно передают из ARG в ENV. Если же параметр нужен только для управления сборкой и не должен «утекать» в конечный контейнер, ограничиваются ARG.
Ниже пример, где ARG используется только для настройки процесса сборки и не попадает в рантайм контейнера.
А в следующем примере показано, как значение из ARG намеренно прокидывают в ENV, чтобы оно было доступно приложению при запуске контейнера.
Отметьте свой прогресс