在 Dockerfile FROM 参数中使用 --build-arg 值

Use --build-arg value in Dockerfile FROM parameter

我目前正在使用 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 指令上。

有什么办法可以实现吗?

更新的答案:

随着 multi-stage builds 的引入,docker 添加了在 FROM 行之前提供 ARG 的功能。这看起来像:

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

注意ARG's are namespaced。在 FROM 行之前定义时,它们可用于 FROM 行。在一个阶段内,它们一直可用到该阶段结束。如果你需要在多个命名空间中使用一个ARG,你可以多次定义它。


引入多阶段构建之前的原始答案:

如您所见,这不受支持,并且 documented in the variable expansion limitations:

Environment variables are supported by the following list of instructions in the Dockerfile:

  • ADD
  • COPY
  • ENV
  • EXPOSE
  • LABEL
  • USER
  • WORKDIR
  • VOLUME
  • STOPSIGNAL

as well as:

  • ONBUILD (when combined with one of the supported instructions above)

要解决此问题,我怀疑您需要先使用外部进程生成 Dockerfile,例如使用 sed "s/__region__/$region/" <Dockerfile.in >Dockerfile 命令。

您的 Dockerfile 中缺少 ARG。 请试试这个。

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