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

 更新时间:2022年08月20日 17:11:30   作者:龚国玮  
这篇文章主要为大家介绍了多阶段构建优化Go 程序Docker镜像,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

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

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

构建 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大小的镜像。

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

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 倍。我们是如何完成的呢?

在第一种情况,使用单阶段构建,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镜像的详细内容,更多关于Go程序Docker镜像的资料请关注脚本之家其它相关文章!

相关文章

  • go语言使用第三方包 json化结构体操作示例

    go语言使用第三方包 json化结构体操作示例

    这篇文章主要介绍了go语言使用第三方包 json化结构体操作,结合实例形式分析了Go语言ffjson包git安装及结构体转json字符串相关操作技巧,需要的朋友可以参考下
    2019-06-06
  • golang gin框架获取参数的操作

    golang gin框架获取参数的操作

    这篇文章主要介绍了golang gin框架获取参数的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Golang中使用不定数量空格分割字符串的方法

    Golang中使用不定数量空格分割字符串的方法

    有这样一个使用空格分割字符串的场景,字符串中被分割的子串之间的空格数量不确定,有一个两个或者多个空格,这种场景下,使用最容易想到的strings.Split函数就做不到了,本文接下来就介绍几种行之有效的方法,需要的朋友可以参考下
    2023-07-07
  • Go 语言中运行 C程序 代码 

    Go 语言中运行 C程序 代码 

    这篇文章主要介绍了Go 语言中运行 C程序代码,通过直接在 Go 代码中写入 C 程序运行,下面操作过程需要的小伙伴可以参考一下
    2022-03-03
  • golang利用pprof与go-torch如何做性能分析

    golang利用pprof与go-torch如何做性能分析

    这篇文章主要给大家介绍了关于golang利用pprof与go-torch如何做性能分析的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-07-07
  • 一文带你熟悉Go语言中函数的使用

    一文带你熟悉Go语言中函数的使用

    这篇文章主要和大家分享一下Go语言中的函数的使用,文中的示例代码讲解详细,对我们学习Go语言有一定的帮助,需要的小伙伴可以参考一下
    2022-11-11
  • go语言更高精度的Sleep实例解析

    go语言更高精度的Sleep实例解析

    这篇文章主要为大家介绍了go语言更高精度的Sleep实例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Golang实现http文件上传小功能的案例

    Golang实现http文件上传小功能的案例

    这篇文章主要介绍了Golang实现http文件上传小功能的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • Go语言开发中redis的使用详解

    Go语言开发中redis的使用详解

    这篇文章主要介绍了Go语言开发中redis的使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • Go连接数据库操作基础讲解

    Go连接数据库操作基础讲解

    这篇文章主要为大家介绍了Go连接数据库操作基础讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12

最新评论