多阶段构建优化Go 程序Docker镜像

作者:龚国玮 时间:2024-02-20 13:57:40 

引言

多阶段构建方式,是在 Dockerfile 中使用多个 FROM 指令,每个 FORM 指令都是一个新的构建阶段,并且可以方便地复制之前阶段的构件。让我们来看一个简单的 Go 程序。代码如下。

点击此处您可以获取代码。

多阶段构建优化Go 程序Docker镜像

构建 Docker 镜像

让我们来为它构建 Docker 镜像,Dockerfile 文件内容如下。

FROM golang:1.19-alpine
WORKDIR /build
COPY go.mod .
RUN go mod download
COPY . .
RUN go build -o /main main.go
ENTRYPOINT ["/main"]

完成后,我们得到了一个 359 MB大小的镜像。

多阶段构建优化Go 程序Docker镜像

现在让我们构建相同的程序,但使用多阶段构建

FROM golang:1.19-alpine as builder
WORKDIR /build
COPY go.mod .
RUN go mod download
COPY . .
RUN go build -o /main main.go
FROM alpine:3
COPY --from=builder main /bin/main
ENTRYPOINT ["/bin/main"]

完成后,我们居然得到了一个只有 12 MB 大小的 Docker 镜像。还不错,我们把镜像大小减少了约 30 倍。我们是如何完成的呢?

多阶段构建优化Go 程序Docker镜像

在第一种情况,使用单阶段构建,Docker 镜像中包含了以下内容。

  • golang:1.19-alpine -- 345.93 MB

  • source size -- 11.1 KB

  • 编译后的应用程序大小 -- 6.5 MB

在第二种情况,我们先编译并构建了应用程序,然后将已经编译的结果复制到最后一个阶段。

  • alpine size:3 -- 5.54 MB

  • 编译后的应用程序大小 -- 6.5 MB

是否可以再减小 Docker 镜像的大小?

答案是:能。但为此我们需要使用 Docker Scratch -- 它是一个 0 MB 的 Docker 镜像。

FROM golang:1.19-alpine as builder
WORKDIR /build
COPY go.mod .
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o /main main.go
FROM scratch
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
COPY --from=builder main /bin/main
ENTRYPOINT ["/bin/main"]

完成后,我们的镜像大小为 6.66 MB。

多阶段构建优化Go 程序Docker镜像

来源:https://juejin.cn/post/7133528305512218637

标签:Go,Docker,镜像
0
投稿

猜你喜欢

  • 对xml操作的主要方法例子

    2008-06-29 14:21:00
  • Flask框架学习笔记之消息提示与异常处理操作详解

    2021-05-17 15:03:02
  • FileSystemObject 示例代码

    2008-10-24 08:54:00
  • mysql中的日期相减的天数函数

    2024-01-20 01:00:51
  • MYSQL大表加索引的实现

    2024-01-16 03:12:36
  • 在TensorFlow中实现矩阵维度扩展

    2021-09-21 17:50:15
  • zabbix监控mysql的实例方法

    2024-01-19 06:39:56
  • 细说Go语言中空结构体的奇妙用途

    2024-04-23 09:46:09
  • MySQL与PHP的基础与应用专题之数据查询

    2023-11-10 10:09:55
  • Python列表计数及插入实例

    2023-05-26 23:41:12
  • python提取word文件中的图片并上传阿里云OSS

    2021-02-01 10:52:25
  • 作符合用户体验的input输入框

    2008-01-10 12:21:00
  • php pdo oracle中文乱码的快速解决方法

    2023-11-16 22:12:47
  • 深入分析PHP引用(&)

    2023-11-23 00:42:35
  • Python正则表达式教程之二:捕获篇

    2023-08-24 00:27:39
  • 比较一下看看自己掌握了多少SQL快捷键

    2009-01-04 14:04:00
  • javascript使用location.search的示例

    2023-07-16 09:14:40
  • 对numpy Array [: ,] 的取值方法详解

    2023-02-05 17:33:23
  • js调用设备摄像头的方法

    2024-04-17 09:46:46
  • PyQt5实现无边框窗口的标题拖动和窗口缩放

    2023-01-17 20:09:45
  • asp之家 网络编程 m.aspxhome.com