多阶段构建优化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语言区块链学习调用以太坊

    go语言区块链学习调用以太坊

    这篇文章主要为大家介绍了go语言区块链学习如何调用以太坊的示例实现过程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-10-10
  • Go中数组传参的几种方式小结

    Go中数组传参的几种方式小结

    本文主要介绍了Go中数组传参的几种方式小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Go语言中 Channel 详解

    Go语言中 Channel 详解

    Go 语言中的 channel 是实现 goroutine 间无锁通信的关键机制,他使得写多线程并发程序变得简单、灵活、触手可得。下面就个人理解对 channel 使用过程中应该注意的地方进行一个简要的总结。
    2018-10-10
  • Go 切片导致内存泄露的几种原因

    Go 切片导致内存泄露的几种原因

    某些情况下,对一个已存在的切片或数组进行切分操作可能会导致内存泄漏,本文主要介绍了Go 切片导致内存泄露的几种原因,感兴趣的可以了解一下
    2023-05-05
  • 浅谈golang的http cookie用法

    浅谈golang的http cookie用法

    本篇文章主要介绍了golang的http cookie用法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • 使用Go语言实现心跳机制

    使用Go语言实现心跳机制

    心跳最典型的应用场景是是探测服务是否存活,这篇文章主要来和大家介绍一下如何使用Go语言实现一个简单的心跳程序,感兴趣的可以了解下
    2024-01-01
  • Go语言多值替换的HTML模板实例分析

    Go语言多值替换的HTML模板实例分析

    这篇文章主要介绍了Go语言多值替换的HTML模板,实例分析了Go语言多值替换与数组迭代的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • Golang排序和查找使用方法介绍

    Golang排序和查找使用方法介绍

    排序操作和查找一样是很多程序经常使用的操作。尽管一个最短的快排程序只要15行就可以搞定,但是一个健壮的实现需要更多的代码,并且我们不希望每次我们需要的时候都重写或者拷贝这些代码
    2022-12-12
  • go实现服务优雅关闭的示例

    go实现服务优雅关闭的示例

    本文主要介绍了go实现服务优雅关闭的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • Go Gin框架路由相关bug分析

    Go Gin框架路由相关bug分析

    这篇文章主要为大家介绍了Go Gin框架路由相关bug分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12

最新评论