Docker撰写与多阶段构build

随着Docker的这个新版本的推出,至less我从来没有听说过它。 我现在的问题是,我应该使用它像一个标准的撰写文件?

我使用docker-compose.yaml来启动容器,其中涉及许多图像,一个用于Web服务器,一个用于数据库。 有了这个新的多阶段构build,我可以使用一个单一的Dockerfile与两个FROM命令,这是什么?

这个多阶段的构build最终会杀死撰写(因为图像较小)?

多阶段构build不会影响docker-compose的使用(尽pipe您可能希望使用swarm模式使用docker stack deploy来使用组合)。 组合仍然需要将多个微服务连接在一起,例如运行一个代理,一些应用程序和一个内存caching。 Compose还简化了将所有configuration选项传递给复杂的Docker镜像,连接networking和卷,configuration重启策略,群集约束等等。所有这些都可以用很多脚本来完成,但是通过一个简单的yaml定义就可以简化。

什么多阶段构build替代是一个多步骤构build,你可能有一个应该不同于运行时环境的构build环境。 这一切都在运行你的容器的docker-composeconfiguration之前。

stream行的例子是一个去二进制。 该二进制文件是静态编译的,所以它不需要其他任何东西来运行。 但是它的构build环境要大得多,因为它引入了编译器和各种库。 这里是一个例子hello.go:

 package main import "fmt" func main() { fmt.Printf("Hello, world.\n") } 

和相应的Dockerfile:

 ARG GOLANG_VER=1.8 FROM golang:${GOLANG_VER} as builder WORKDIR /go/src/app COPY . . RUN go-wrapper download RUN go-wrapper install FROM scratch COPY --from=builder /go/bin/app /app CMD ["/app"] 

Dockerfile的两条FROM行使它成为一个多阶段构build。 第一个FROM行用go编译器创build第一个阶段。 第二个FROM行也是最后一个,这使得它成为你构build时默认的标记图像。 在这种情况下,该阶段是单个二进制文件的运行时间。 其他阶段都被caching在构build服务器上,但不会被最终映像复制。 如果需要使用docker build --target=builder .单个部件,则可以将构build目标定位到不同的阶段docker build --target=builder . 命令。

当您查看构build的结果时,这变得很重要:

 $ docker build -t test-mult-stage . Sending build context to Docker daemon 4.096kB Step 1/9 : ARG GOLANG_VER=1.8 ---> Step 2/9 : FROM golang:${GOLANG_VER} as builder ---> a0c61f0b0796 Step 3/9 : WORKDIR /go/src/app ---> Using cache ---> af5177aae437 Step 4/9 : COPY . . ---> Using cache ---> 976490d44468 Step 5/9 : RUN go-wrapper download ---> Using cache ---> e31ac3ce83c3 Step 6/9 : RUN go-wrapper install ---> Using cache ---> 2630f482fe78 Step 7/9 : FROM scratch ---> Step 8/9 : COPY --from=builder /go/bin/app /app ---> 96b9364cdcdc Removing intermediate container ed558a4da820 Step 9/9 : CMD /app ---> Running in 55db8ed593ac ---> 5fd74a4d4235 Removing intermediate container 55db8ed593ac Successfully built 5fd74a4d4235 Successfully tagged test-mult-stage:latest $ docker images | grep 2630 <none> <none> 2630f482fe78 5 weeks ago 700MB $ docker images | grep test-mult-stage test-mult-stage latest 5fd74a4d4235 33 seconds ago 1.56MB 

请注意,运行时映像仅为1.5 MB,而使用编译器的untaging builder映像为700 MB。 以前为了获得相同的空间节省,您需要在docker外部编译应用程序,并处理docker通常为您解决的所有依赖性问题。 或者你可以在一个容器中进行构build,将结果复制出该容器,并将该复制的文件用作另一个构build的input。 多阶段构build将第二个选项转换为单个可重复和便携的命令。

多阶段function允许您创build临时版本并提取其文件以用于最终版本。 例如你需要gcc来构build你的库,但是你不需要生产容器中的gcc 。 虽然,您可以使用几行bash脚本来执行多个构build,但是多阶段function允许您使用单个Dockerfile来执行构build。 不pipe你是如何构build的,它只使用你的最终图像,所以它们是无关的。