【问题标题】:docker multistage build fails with multiple --build-argdocker multistage build 失败,带有多个 --build-arg
【发布时间】:2018-06-27 17:22:49
【问题描述】:

我正在使用这个 Dockerfile

ARG IMAGE_ONE
FROM ${IMAGE_ONE}
RUN cat /etc/debian_version

ARG IMAGE_TWO
FROM ${IMAGE_TWO}
RUN cat /etc/debian_version

但它失败了,因为它没有使用第二个 var IMAGE_TWO:

$ docker build --no-cache --build-arg IMAGE_ONE=debian:7 --build-arg IMAGE_TWO=debian:8 .
Sending build context to Docker daemon  2.048kB
Step 1/6 : ARG IMAGE_ONE
Step 2/6 : FROM ${IMAGE_ONE}
 ---> 90c038768099
Step 3/6 : RUN cat /etc/debian_version
 ---> Running in f842d9cf4f17
7.11
Removing intermediate container f842d9cf4f17
 ---> 0f7f7afdd8a6
Step 4/6 : ARG IMAGE_TWO
 ---> Running in ed3d36f2f9cb
Removing intermediate container ed3d36f2f9cb
 ---> ae4ae3cabc02
Step 5/6 : FROM ${IMAGE_TWO}
 --->
Step 6/6 : RUN cat /etc/debian_version
 ---> Running in 6f1c165e2765
OCI runtime create failed: container_linux.go:296:
    starting container process caused "exec: \"/bin/sh\":
    stat /bin/sh: no such file or directory": unknown

Docker 版本:

$ docker --version
Docker version 17.12.0-ce, build c97c6d6

我的 Dockerfile 有问题还是 docker build 命令有误?

【问题讨论】:

    标签: docker containers dockerfile docker-image docker-multi-stage-build


    【解决方案1】:

    原因是因为IMAGE_TWO不在同一个范围检查这个 https://docs.docker.com/engine/reference/builder/#scope

    基本上,ARG IMAGE_TWO 仍然是第一阶段的一部分,并且在该阶段结束时超出范围,不会成为第二阶段的一部分。

    在开头声明参数允许 IMAGE_TWO 处于第二阶段。

    ARG IMAGE_ONE
    ARG IMAGE_TWO
    FROM ${IMAGE_ONE}
    RUN cat /etc/debian_version
    
    FROM ${IMAGE_TWO}
    RUN cat /etc/debian_version
    

    docker build --build-arg=IMAGE_ONE=debian:7 --build-arg=IMAGE_TWO=debian:8 .

    【讨论】:

    • 请注意,在第一个 FROM 指令(例如 IMAGE_ONEIMAGE_TWO上方定义的 ARG 值仅可用于多阶段构建中的 FROM 指令和(违反所有直觉)在构建阶段的“主体”中可用。见this discussion
    猜你喜欢
    • 2021-03-06
    • 2019-08-23
    • 2017-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    • 1970-01-01
    • 2020-04-19
    相关资源
    最近更新 更多