ARG vs ENV
Тема дорожной карты · Docker & Containers
ARG и ENV — это два ключевых элемента Dockerfile, которые играют важную роль в управлении переменными и настройками при сборке и запуске контейнеров. В то время как ARG используется для передачи данных только во время сборки, ENV позволяет задать переменные окружения, которые будут доступны в контейнере после его запуска. Это делает их незаменимыми для настройки среды разработки и тестирования, а также для управления конфигурациями в продакшне.
Как это работает
ARG объявляет переменную, доступную только во время сборки, а ENV — переменную окружения, зашитую в образ и видимую в работающем контейнере. ARG можно передать через параметр --build-arg, что позволяет задавать значения переменных на этапе сборки. Это полезно для настройки условий сборки, таких как версии зависимостей или настройки сборки. В то время как ENV используется для задания переменных окружения, которые будут доступны в контейнере после его запуска. Это позволяет задавать значения переменных, которые будут использоваться при выполнении команд в контейнере.
ARG и ENV могут быть использованы в сочетании для управления различными аспектами сборки и выполнения контейнеров. Например, можно использовать ARG для передачи значений переменных на этапе сборки, а затем использовать ENV для задания значений переменных, которые будут доступны в контейнере после его запуска. Это позволяет эффективно управлять конфигурациями и настройками контейнеров.
Когда применять
ARG и ENV следует использовать в зависимости от конкретной задачи. ARG подходит для передачи значений переменных на этапе сборки, таких как версии зависимостей или настройки сборки. Это полезно для управления конфигурациями сборки, таких как версии зависимостей или настройки сборки. В то время как ENV используется для задания переменных окружения, которые будут доступны в контейнере после его запуска. Это позволяет задавать значения переменных, которые будут использоваться при выполнении команд в контейнере.
ARG и ENV также могут быть использованы для управления различными аспектами сборки и выполнения контейнеров. Например, можно использовать ARG для передачи значений переменных на этапе сборки, а затем использовать ENV для задания значений переменных, которые будут доступны в контейнере после его запуска. Это позволяет эффективно управлять конфигурациями и настройками контейнеров.
Типичные ошибки
Одной из распространенных ошибок при использовании ARG и ENV является попытка использовать ARG для передачи секретных данных, таких как пароли или ключи доступа. Это может привести к утечке конфиденциальной информации, так как значения ARG остаются в истории образа и могут быть просмотрены с помощью команды docker inspect. Вместо этого следует использовать BuildKit --mount=type=secret для безопасного передачи секретных данных.
Еще одной распространенной ошибкой является попытка использовать ENV, заданный после RUN, для изменения значений переменных, которые были установлены ранее. Это может привести к непредсказуемому поведению контейнера, так как значения ENV, заданные после RUN, не видны предыдущему RUN. Вместо этого следует использовать ENV для задания значений переменных, которые будут доступны в контейнере после его запуска.
Как это работает
ARG и ENV покрывают различные аспекты сборки и выполнения контейнеров, такие как BuildKit (современный builder, дефолтный с версии 23.0), multi-stage сборки, build-secrets, cache mounts, build args против runtime env, мульти-платформенные сборки через buildx. RUN --mount=type=cache,target=/root/.npm позволяет хранить npm/pnpm кэш между сборками, что значительно ускоряет процесс сборки. RUN --mount=type=secret,id=mytoken позволяет безопасно передать секреты, которые не попадают в слой образа. ARG используется только во время сборки, в то время как ENV доступен в рантайме. HEALTHCHECK определяет, как Docker проверяет контейнер на предмет его работоспособности.
Когда применять
BuildKit (он дефолтный) + --mount=type=cache — везде, где сборка качает пакеты; драматически режет время CI. Мульти-платформенные buildx-сборки — когда таргет и x86_64, и arm64 (Raspberry Pi, M-series Mac, Graviton). HEALTHCHECK — на любой долгий сервис; делает ожидания compose up и пробы оркестратора корректными.
Типичные ошибки
Ловушки ARG vs ENV: секреты через ARG (утекают в history и docker inspect); cache-bust после каждого apt update, потому что следующая инструкция всегда меняется (группируйте apt-команды в один RUN); забытый DOCKER_BUILDKIT=1 на старом Docker даёт странные "unknown flag" на --mount; HEALTHCHECK каждые 30s со стартом 90s — контейнер помечен как неактивный слишком быстро.
Связанные понятия
Расширенная инструкция Dockerfile Многоэтапные сборки Инструкция HEALTHCHECK Лучшие практики кэширования слоев