Docker Compose与多阶段构建
有了这个new version的Docker,多阶段构建得到了引入,至少我以前从未听说过它.我现在的问题是,我应该像标准的Compose文件一样使用它吗? 我使用docker-compose.yaml来启动容器,其中涉及许多图像,一个用于Web服务器,另一个用于数据库.有了这个新的多阶段构建,我可以使用一个带有两个FROM命令的Dockerfile吗?就是这样吗? 这个多阶段构建最终是否会杀死Compose(因为图像较小)? 最佳答案
多阶段构建不会影响docker-compose的使用(尽管您可能希望使用具有swarm模式的docker stack deploy来使用该组合在一个swarm上).仍需要撰写将多个微服务连接在一起,例如,运行代理,一些应用程序和内存缓存. Compose还简化了将所有配置选项传递到复杂的docker镜像,附加网络和卷,配置重启策略,swarm约束等等.所有这些都可以通过大量脚本完成,但通过简单的yaml定义可以更轻松.
多阶段构建所取代的是多步构建,其中您可能具有应该与运行时环境不同的构建环境.这是在运行容器的docker-compose配置之前的全部内容. 流行的例子是go二进制文件.该二进制文件是静态编译的,因此它不需要运行任何其他内容.但是它的构建环境要大得多,因为它引入了编译器和各种库.这是一个例子hello.go:
和相应的Dockerfile:
Dockerfile的两个FROM行使它成为多阶段构建.第一个FROM行使用go编译器创建第一个阶段.第二个FROM行也是最后一行,使其成为构建时标记的默认图像.在这种情况下,该阶段是单个二进制文件的运行时.其他阶段都缓存在构建服务器上,但不会与最终映像一起复制.如果需要使用docker build –target = builder构建单个部分,则可以将构建目标指向不同的阶段.命令. 当您查看构建的结果时,这变得很重要:
请注意,运行时映像仅为1.5 MB,而使用编译器的未处理构建器映像为700 MB.以前为了节省相同的空间,您需要在docker之外编译应用程序,并处理docker通常会为您解决的所有依赖性问题.或者您可以在一个容器中进行构建,将结果复制出该容器,并将该复制的文件用作另一个构建的输入.多阶段构建将第二个选项转换为单个可重现且可移植的命令. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |