前言
在我们日常构建镜像中,镜像构建会依赖上一次镜像构建生产的内容。比如在构建一个JAVA语言镜像,需要先在一个Dockerfile中编译生成JAR包,然后再另外一个Dockerfile把编译好的JAR放到镜像中。这样就相当于增大了CI/CD的复杂度。
Docker多阶段构建是17.05以后引入的新特性,旨在解决编译和构建复杂的问题。减小镜像大小。因此要使用多阶段构建特性必须使用高于或等于17.05的Docker。
一、多阶段构建出现之前
构建镜像最具挑战性的一点是使镜像大小尽可能的小。Dockerfile中的每条指令都为图像添加了一个图层,为了编写高效的Dockerfile,传统上需要使用shell技巧和其他逻辑来保持层尽可能小,并确保每个层都具有前一层所需的工件而不是其他任何东西。
在实际工作中,往往有一个Dockerfile用于开发(包含构建应用程序所需的所有内容),还有一个Dockerfile用于生产环境的精简版,它只包含应用程序以及运行它所需的内容。这被称为“建造者模式”。但维护两个Dockerfiles并不是理想的状态。
这是一个Dockerfile.build和Dockerfile的例子,它遵循上面的模式:
Dockerfile.build:
FROM golang:1.7.3
WORKDIR /go/src/github.com/alexellis/href-counter/
COPY app.go .
RUN go get -d -v golang.org/x/net/html \
&& CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
Docke