【问题标题】:Use --build-arg value in Dockerfile FROM parameter在 Dockerfile FROM 参数中使用 --build-arg 值
【发布时间】:2016-08-19 22:40:26
【问题描述】:

我目前正在使用 AWS ECR 来托管我的项目映像,并且我需要根据命令行发送的 --build-arg 参数 FROM 在 Dockerfile 中是动态的。示例:

$ 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 指令上。

有什么方法可以实现吗?

【问题讨论】:

    标签: amazon-web-services docker dockerfile devops amazon-ecs


    【解决方案1】:

    更新答案:

    随着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:

    以下列表支持环境变量 Dockerfile 中的说明:

    • 添加
    • 复制
    • 环境
    • 曝光
    • 标签
    • 用户
    • 工作目录
    • 音量
    • 停止信号

    还有:

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

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

    【讨论】:

      【解决方案2】:

      您的 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 中的第一个(非注释)命令
      • FROM 指令支持由出现在第一个 FROM 之前的任何 ARG 指令声明的变量。见:docs.docker.com/engine/reference/builder/…
      • @lekant 首次发布此答案时并非如此。多阶段构建改变了这种行为。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 2018-12-06
      • 2022-01-20
      • 2019-07-17
      • 2017-12-22
      • 2017-07-06
      • 2020-09-26
      相关资源
      最近更新 更多