Dockerfile-多阶段构建(2)
来看多阶段构建如何做
对于多阶段构建,我们可以在Dockerfile里使用多个FROM命令。每个FROM都可以使用不同的基础镜像,并且每一个都会开始一个新的构建阶段。我们可以选择性的将组建从一个阶段复制到下一个阶段中,最终,最后的构建只会留下所有需要的东西,不想要的东西都不会出现在最终镜像中,这样以来镜像的体积就会小很多了。
接下来的例子,是优化了上一篇文章之中的构建Dockerfile-多阶段构建(1)
Dockerfile
# syntax=docker/dockerfile:1 FROM golang:1.16 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,不需要分开成两个文件。
最终的结果是一样的,但是镜像体积变得更小,复杂性也显著降低。不再需要构建任何基础镜像。
那他是如何工作的呢?
第二个FROM指令以alpine:latest镜像为基础开始一个新的构建阶段。COPY --from=0能将构建的组建从上一个阶段复制到当前的新阶段。Go SDK和任何中间的依赖都会被留下,不会保存在最终的镜像当中。