2017-06-29 128 views
4

随着Docker的这个new version,引入了多阶段构建,至少我从未听说过它。我现在的问题是,我应该像使用标准的Compose文件一样使用它吗?Docker撰写与多阶段构建

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

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

回答

6

多阶段构建不会影响码头构成的使用(尽管您可能想用swarm模式使用docker stack deploy来使用构成群集)。组合仍然需要将多个微服务连接在一起,例如运行一个代理,一些应用程序和一个内存缓存。 Compose还简化了将所有配置选项传递给复杂的Docker镜像,连接网络和卷,配置重启策略,swarm约束等。所有这些都可以通过大量脚本完成,但通过简单的yaml定义可以使其更容易。

什么多阶段构建替代是一个多步骤构建,您可能有一个应该不同于运行时环境的构建环境。这是运行您的容器的docker-compose配置之前。

流行的例子是一个去二进制。该二进制文件是静态编译的,所以它并不需要其他任何东西来运行。但是它的编译环境更大,因为它引入了编译器和各种库。下面是一个例子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"] 

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

$ 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,而与编译器的untaged建设者形象是700MB:

,当你在构建的结果,这将成为非常重要的。之前为了获得相同的空间节省,您需要在docker外部编译应用程序,并处理docker通常为您解决的所有依赖性问题。或者,您可以在一个容器中进行构建,将结果复制出该容器,并将该复制的文件用作另一个构建的输入。多阶段构建将第二个选项转变为单个可重复和便携的命令。

4

多阶段功能允许您创建临时版本并提取其文件以用于最终版本。对于例如您需要gcc来构建您的库,但是您不需要在生产容器中使用gcc。虽然,您可以使用几行bash脚本来执行多个构建,但多级功能允许您使用单个Dockerfile来完成它。无论您是如何构建它,撰写只使用您的最终图像,因此它们无关。