seb*_*mez 7 docker docker-compose
有了这个新版本的Docker,我会介绍多阶段构建,至少我以前从未听说过.我现在的问题是,我应该像标准的Compose文件一样使用它吗?
我曾经docker-compose.yaml在容器中启动许多图像,其中一个用于Web服务器,一个用于数据库.有了这个新的多阶段构建,我可以使用一个单独Dockerfile的两个FROM命令吗?
这个多阶段构建最终是否会杀死Compose(因为图像较小)?
BMi*_*tch 10
多阶段构建不会影响docker-compose的使用(尽管您可能希望使用docker stack deployswarm模式来使用该组合在一个swarm上).仍需要Compose将多个微服务连接在一起,例如运行代理,一些应用程序和内存缓存.Compose还简化了将所有配置选项传递到复杂的docker镜像,附加网络和卷,配置重启策略,swarm约束等等.所有这些都可以通过大量脚本完成,但通过简单的yaml定义可以更轻松.
多阶段构建所取代的是多步构建,其中您可能具有应该与运行时环境不同的构建环境.这是在docker-compose运行容器配置之前的全部内容.
流行的例子是go二进制文件.该二进制文件是静态编译的,因此它不需要运行任何其他内容.但是它的构建环境要大得多,因为它引入了编译器和各种库.这是一个例子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"]
FROMDockerfile 的两条线使它成为一个多阶段构建.第一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,而使用编译器的未处理构建器映像为700 MB.以前为了节省相同的空间,您需要在docker之外编译应用程序,并处理docker通常会为您解决的所有依赖性问题.或者您可以在一个容器中进行构建,将结果复制出该容器,并将该复制的文件用作另一个构建的输入.多阶段构建将第二个选项转换为单个可重现且可移植的命令.
多阶段功能允许您创建临时构建并提取它们的文件以用于最终构建。例如,您需要gcc构建库,但gcc在生产容器中不需要。虽然您可以使用几行 bash 脚本进行多次构建,但多阶段功能允许您使用单个 Dockerfile 来完成。无论您是如何构建它的,Compose 都只使用您的最终图像,因此它们是不相关的。
| 归档时间: | 
 | 
| 查看次数: | 6125 次 | 
| 最近记录: |