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

4

我目前使用AWS ECR来托管我的项目镜像,我需要使Dockerfile中的参数FROM根据从命令行发送的--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个回答

7

更新的回答:

随着多阶段构建的引入,Docker增加了在FROM行之前提供ARG的能力。这将看起来像:

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

注意,ARG具有命名空间。如果在FROM行之前定义,它们将对FROM行可用。而在一阶段中,它们可用直到该阶段的结束。如果需要在多个命名空间中使用ARG,则可以多次定义它们。

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

正如你所发现的,这不受支持,并且在变量扩展限制中有记录:

下列Dockerfile指令支持环境变量:

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

以及:

  • ONBUILD(当与上述支持的指令结合使用时)

为了解决这个问题,我认为您需要首先使用外部进程生成Dockerfile,例如使用sed "s/__region__/$region/" <Dockerfile.in >Dockerfile命令。


0

你的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

FROM需要是Dockerfile中的第一个(非注释)命令。 - renefritze
FROM 指令支持在第一个 FROM 之前声明的任何 ARG 指令声明的变量。请参阅:https://docs.docker.com/engine/reference/builder/#understand-how-arg-and-from-interact - lekant
1
@lekant 当这个答案首次发布时情况并非如此。多阶段构建改变了这种行为。 - BMitch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接