原文链接 https://blog.alexellis.io/mutli-stage-docker-builds/
相关参考 https://docs.docker.com/develop/develop-images/multistage-build/
关键词 - COPY --from=
是么是建造器模式? 对于像Golang这样的静态编译语言,人们倾向从Golang“ SDK”镜像中获取其Dockerfile,添加源代码,进行构建,然后将其推送到Docker Hub。不幸的是,所得图像的大小非常大-至少为670mb。
A workaround which is informally called the builder pattern involves using two Docker images - one to perform a build and another to ship the results of the first build without the penalty of the build-chain and tooling in the first image.
有个变通之法(非正式版),叫建造器模式,涉及到两个Docker镜像, 一个用于执行构建,另一个用于调用第一个构建的结果,后者完成后不会影响第一个镜像中内容。
建造器模式的示例: 从Golang基本映像派生整个运行时/ SDK(Dockerfile.build) 添加源代码 产生一个静态链接的二进制文件 将静态二进制文件从映像复制到主机(docker create,docker cp) 源自SCRATCH或其他一些轻量级图像,例如alpine(Dockerfile) 重新添加二进制文件 将微小的映像推送到Docker Hub
一个例子:
Dockerfile.build
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 .
Dockerfile