Docker多阶段构建在使用多个--build-arg时失败

4
我正在使用这个Dockerfile。
ARG IMAGE_ONE
FROM ${IMAGE_ONE}
RUN cat /etc/debian_version

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

但是它失败了,因为它没有使用第二个变量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命令有问题?
1个回答

22
原因是因为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-arg选项指定构建参数,例如:docker build --build-arg=IMAGE_ONE=debian:7 --build-arg=IMAGE_TWO=debian:8 .


13
请注意,在第一个FROM指令之前定义的ARG值,例如IMAGE_ONE或IMAGE_TWO,仅在多阶段构建中对FROM指令可用,并且(与直觉相反)在构建阶段的“主体”中不可用。请参阅此讨论。 - Felix K.

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