Используйте значение --build-arg в Dockerfile из параметра


В настоящее время я использую AWS ECR для размещения изображений моего проекта, и мне нужно, чтобы параметр FROM был динамическим в Dockerfile в соответствии с --build-arg, отправленным из командной строки. Пример:

$ docker build --build-args region=us-east-1 .

// Dockerfile
FROM aws.ecr.huge.url.${region}/repo:php-apache
WORKDIR /var/www
RUN echo "@@@"

${region} никогда не заменяется, и я получаю ошибку, говорящую, что изображение не существует.

Если я запускаю echo ${region}, это работает, проблема, кажется, с инструкцией FROM.

Есть ли какой-нибудь способ достичь этого?
2 2

2 ответа:

Обновленный ответ:

С введением многоступенчатых сборок, docker добавил возможность предоставлять ARG перед строкой FROM. Это будет выглядеть так:

# default to us-east-1
ARG region=us-east-1
FROM aws.ecr.huge.url.${region}/repo:php-apache

Обратите внимание, что ARG's-пространство имен . Если они определены перед строкой FROM, они доступны для строк FROM. И внутри стадии они доступны до конца этой стадии. Если вам нужно использовать ARG в нескольких пространствах имен, вы можете определить его несколько раз.


Оригинальный ответ от до введения многоступенчатых сборок:

Это не поддерживается, как вы нашли, и как задокументировано в ограничениях расширения переменных :

Переменные окружения поддерживаются следующим списком инструкции в файле Dockerfile:

  • добавить
  • копия
  • ENV
  • разоблачить
  • метка
  • пользователь
  • директорию
  • объем
  • стопсигнал

А также:

  • ONBUILD (в сочетании с одной из поддерживаемых инструкций выше)

Чтобы обойти это, я подозреваю, что вам нужно будет сначала сгенерировать Dockerfile с помощью внешнего процесса, например, с помощью команды sed "s/__region__/$region/" <Dockerfile.in >Dockerfile.

ARG отсутствует в вашем файле Dockerfile. Пожалуйста, попробуйте это.

$ docker build --build-args region=us-east-1 .
// Dockerfile
ARG region
FROM aws.ecr.huge.url.${region}/repo:php-apache
WORKDIR /var/www