ARG - змінна часу збирання. Доступна лише під час docker build, у запущеному контейнері її немає:
ARG PHP_VERSION=8.5
FROM php:${PHP_VERSION}-fpm-alpine
ARG APP_VERSION=dev
RUN echo "Building version $APP_VERSION"
docker build --build-arg APP_VERSION=1.4.2 .
ENV - змінна середовища образу. Діє і під час збирання (у наступних інструкціях), і в кожному запущеному контейнері:
ENV APP_ENV=production \
PHP_OPCACHE_VALIDATE_TIMESTAMPS=0
Значення за замовчуванням можна перевизначити при запуску: docker run -e APP_ENV=staging ....
Типові поєднання:
ARG APP_VERSION=dev
ENV APP_VERSION=${APP_VERSION} # перенести значення збирання в середовище контейнера
Особливості ARG:
- область видимості:
ARG, оголошений доFROM, доступний лише в рядкуFROM. Щоб використати його всередині етапу, треба повторитиARG PHP_VERSIONпісляFROM; - кожен етап multi-stage збирання має свої
ARG; - вбудовані змінні BuildKit:
TARGETPLATFORM,TARGETARCH,BUILDPLATFORM- для мультиплатформних збирань.
Головна пастка - секрети:
ARG GITHUB_TOKEN
RUN composer config github-oauth.github.com $GITHUB_TOKEN && composer install
Значення ARG зберігається в історії образу (docker history показує команди з підставленими значеннями), а ENV - ще й у метаданих образу й кожному контейнері. Будь-хто з доступом до образу прочитає секрет. docker build --check попереджає про це правилом SecretsUsedInArgOrEnv. Для секретів - RUN --mount=type=secret.
Що куди класти:
ARG- параметри збирання: версії базових образів і інструментів, прапорці («встановити розширення для розробки»), версія релізу;ENV- налаштування середовища, однакові для всіх запусків образу (шляхи, параметри PHP);- конфігурація конкретного середовища (база, ключі, URL) - не в образ, а при запуску: змінні оточення,
.env, секрети оркестратора. Один образ має працювати і на staging, і на продакшені.