当前位置: 首页 > article >正文

【docker】多阶段构建与单阶段构建

  1. 单阶段构建(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 工具链),使镜像体积较大。
    • 不适合生产环境,因为镜像中包含了构建相关的工具和源代码,可能带来安全问题。
    • 运行时环境包含不必要的构建工具和依赖,增加了攻击面和容器的启动时间。
  1. 多阶段构建(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 更复杂,因为需要为不同的阶段指定不同的镜像。
    • 构建过程较为冗长,需要多个阶段来完成构建和运行,可能稍微增加构建时间。
  1. 对比总结
  • 单阶段构建:构建和运行都在同一个镜像中完成,最终镜像较大,包含了构建工具和源代码。

    • 适合小型项目或快速开发,但不适合生产环境。
    • 镜像较大,不适合持续交付或生产环境部署。
  • 多阶段构建:将构建过程分为多个阶段,最终镜像只包含需要的运行时环境和构建完成的二进制文件。

    • 适合生产环境,能够减小镜像体积,避免不必要的构建工具暴露在镜像中。
    • 更适合复杂项目或对镜像大小、安全性有较高要求的场景。

http://www.kler.cn/a/420455.html

相关文章:

  • PLC协议
  • 【25春招前端八股文】——JS数据类型检测方式
  • Meta-Llama-3-8B-Instruct 模型的混合精度训练显存需求:AdamW优化器(中英双语)
  • SpringMVC(二)
  • 在办公室环境中用HMD替代传统显示器的优势
  • 消息中间件-Kafka1-实现原理
  • leetcode每日一题(20241202)
  • BERT的中文问答系统36-2
  • Java GET请求 请求参数在Body中使用Json格式传参
  • 简单介绍下 VitePress 中的 vp-doc 和 vp-raw
  • Git:分支管理
  • 面试小札:JVM虚拟机
  • LeetCode Hot100 21~30
  • 数仓3.0与大模型(如大型语言模型和其他深度学习模型)之间的关系
  • 机器学习(3)朴素贝叶斯算法
  • 数据库日志
  • HTML前端开发-- Flex布局详解及实战
  • 4k4d 学习安装笔记
  • CS144(七)
  • Linux - selinux
  • 屏幕触控支持指纹
  • 小程序 - 比较数字大小
  • Git 快速入门:全面了解与安装步骤
  • Leetcode:3195
  • RabbitMQ的工作模式
  • MySQL1.0