使用来自两个基本映像的文件

时间:2020-05-09 15:04:56

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

我有两个docker映像。映像x只是将一些文件复制到映像,映像y将复制其他文件并安装一些需要的库。 我想基于这两个图像构建第三个dockerfile = z。

z的示例:

来自x 。

从y开始 。

如何构建可以使用x和y中的那些文件的dockerfile z?

2 个答案:

答案 0 :(得分:1)

以下内容来自Docker官方网站。

使用多阶段构建

对于多阶段构建,您可以在Dockerfile中使用多个FROM语句。每个FROM指令可以使用不同的基数,并且每个都开始构建的新阶段。您可以有选择地将工件从一个阶段复制到另一个阶段,从而在最终图像中留下不需要的所有内容。为了展示它是如何工作的,让我们调整上一节中的Dockerfile以使用多阶段构建。

Dockerfile:

FROM golang:1.7.3
WORKDIR /go/src/github.com/alexellis/href-counter/
RUN go get -d -v golang.org/x/net/html  
COPY app.go .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .

FROM alpine:latest  
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=0 /go/src/github.com/alexellis/href-counter/app .
CMD ["./app"]

您只需要单个Dockerfile。您也不需要单独的构建脚本。只需运行docker build。

$ docker build -t alexellis2/href-counter:latest .

最终结果是与以前相同的微小生产图像,并大大降低了复杂性。您不需要创建任何中间图像,也不需要将任何工件提取到本地系统中。

它如何工作?第二条FROM指令以alpine:latest映像为基础开始新的构建阶段。 COPY --from=0行仅将先前阶段的已构建工件复制到新阶段。 Go SDK和所有中间工件都被保留了下来,没有保存在最终图像中。

来源:Docker Multi Stage Builds

答案 1 :(得分:0)

尝试一下:

FROM x as image1

FROM y as image2

FROM centos

COPY --from=image1 <source_path> <destinantion_path>

COPY --from=image2 <source_path> <destinantion_path>

Reference