docker中多阶段构建与单阶段构建的具体使用
作者:{⌐■_■}
本文主要介绍了docker中多阶段构建与单阶段构建的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
单阶段构建(Single-Stage Build)
在单阶段构建中,所有构建过程都在一个镜像中完成。构建工具和最终的运行时环境都包含在同一个镜像中,导致最终镜像的体积较大。
单阶段构建 Dockerfile 示例:
FROM golang:1.18 WORKDIR /app COPY ./helloworld /app/ // 设置 Go 代理环境变量 ENV GO111MODULE=on ENV GOPROXY=https://goproxy.cn,direct // 使用中国的 Go 代理,确保更快速的包下载 RUN go mod tidy RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app . EXPOSE 80 CMD ["./app", "--param1=p1", "--param2=p2"]
优缺点:
- 优点:
- 构建过程简单,只有一个阶段。
- 缺点:
- 最终镜像包含构建工具(如
go
工具链),使镜像体积较大。 - 不适合生产环境,因为镜像中包含了构建相关的工具和源代码,可能带来安全问题。
- 运行时环境包含不必要的构建工具和依赖,增加了攻击面和容器的启动时间。
- 最终镜像包含构建工具(如
多阶段构建(Multi-Stage Build)
在多阶段构建中,构建过程被分成多个阶段。每个阶段可以使用不同的基础镜像,最终镜像只包含必要的运行时环境和构建完成的二进制文件。
这种方法的好处是可以显著减小最终镜像的体积,同时避免将不必要的构建工具和依赖包含在生产环境的镜像中。
多阶段构建 Dockerfile 示例:
# 第一阶段:构建 Go 应用 FROM golang:1.18 AS builder WORKDIR /go/src/helloworld COPY ./helloworld /go/src/helloworld // 设置 Go 代理环境变量 ENV GO111MODULE=on ENV GOPROXY=https://goproxy.cn,direct // 使用中国的 Go 代理,确保更快速的包下载 RUN go mod tidy RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app . # 第二阶段:运行 Go 应用 FROM alpine:latest WORKDIR /app COPY --from=builder /go/src/helloworld/app /app/ EXPOSE 80 CMD ["./app", "--param1=p1", "--param2=p2"]
优缺点:
- 优点:
- 可以有效减少最终镜像的体积,只包含运行时环境和必要的二进制文件。
- 可以选择不同的镜像来进行不同的构建步骤,例如使用
golang
镜像构建代码,使用更小的alpine
镜像运行应用。 - 避免了构建工具和源代码暴露在最终镜像中,提高了安全性。
- 缺点:
- Dockerfile 更复杂,因为需要为不同的阶段指定不同的镜像。
- 构建过程较为冗长,需要多个阶段来完成构建和运行,可能稍微增加构建时间。
对比总结
单阶段构建:构建和运行都在同一个镜像中完成,最终镜像较大,包含了构建工具和源代码。
- 适合小型项目或快速开发,但不适合生产环境。
- 镜像较大,不适合持续交付或生产环境部署。
多阶段构建:将构建过程分为多个阶段,最终镜像只包含需要的运行时环境和构建完成的二进制文件。
- 适合生产环境,能够减小镜像体积,避免不必要的构建工具暴露在镜像中。
- 更适合复杂项目或对镜像大小、安全性有较高要求的场景。
到此这篇关于docker中多阶段构建与单阶段构建的具体使用的文章就介绍到这了,更多相关docker 多阶段构建与单阶段构建内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!