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

目录
  • 引言
  • 构建 Docker 镜像
  • 是否可以再减小 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镜像的资料请关注我们其它相关文章!

(0)

相关推荐

  • 使用Docker镜像构建Go应用的实现方法

    目录 修炼背景 第一次尝试 第二次尝试 第三次尝试 神功练成 项目地址 修炼背景 我夜以继日,加班加点开发了一个最简单的 Go Hello world 应用,虽然只是跑了打印一下就退出了,但是老板也要求我上线这个我能写出的唯一应用. 项目结构如下: . ├── go.mod └── hello.go hello.go 代码如下: package main func main() { println("hello world!") } 并且,老板要求用 docker 部署,显得咱们紧跟潮

  • 构建Golang应用最小Docker镜像的实现

    我通常使用docker运行我的 golang 程序,在这里分享一下我构建 docker 镜像的经验.我构建 docker 镜像不仅优化构建后的体积,还要优化构建速度. 示例应用 首先贴出代码例子,我们假设要构建一个 http 服务 package main import ( "fmt" "net/http" "time" "github.com/gin-gonic/gin" ) func main() { fmt.Printl

  • 基于Docker镜像部署go项目的方法步骤

    依赖知识 Go交叉编译基础 Docker基础 Dockerfile自定义镜像基础 docker-compose编排文件编写基础 当然,一点也不会也可以按照这个步骤部署完成,不过可能中间如果出点小问题,会不知道怎么解决,当然你也可以留言. 我是在mac环境上开发测试的,如果你是在windows上可能有一点出入,但应该不会有啥大问题. 一.依赖环境 Docker 二.编写一个GoLang web程序 我这里就写一个最简单的hello world程序吧,监听端口是80端口. 新建一个main.go文件

  • docker 基于golang镜像构建 ssh服务的方法

    下面给大家介绍下docker 基于golang镜像构建 ssh服务的代码,具体内容如下所示: # golang:latest镜像 FROM ee23292e2826 # 作者 MAINTAINER dechao@qq.com # 添加Golang环境变量 ENV GOPROXY https://goproxy.cn,direct ENV GO111MODULE on # 配置apt-get源 ADD sources.list /etc/apt/ # 更新apt-get源 安装ssh服务 修改ro

  • 使用GoogleContainerTools容器化jib构建docker镜像

    目录 前言碎语 插件配置 配置详解 插件命令使用 集成插件生命周期 文末结语 前言碎语 今天分享一个在容器化过程中非常重要的一个工具,java应用docker镜像build工具jib,这个工具是谷歌团队研发开源的,特点是不依赖docker守护进程,直白点说就是本地环境不安装docker环境也可以打包docker镜像.不用依赖维护Dockerfile,而且基于java打包插件可以轻松嵌入到java本身的构建生命周期中(本文使用maven).可以说是java容器化构建利器. 插件配置 <plugin

  • Docker 部署Go的两种基础镜像的实现

    一. golang:latest 基础镜像 mkdir gotest touch main.go touch Dockerfile 1. 实例代码 package main import ( "fmt" "log" "net/http" ) func main() { http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) { f

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

    目录 引言 构建 Docker 镜像 是否可以再减小 Docker 镜像的大小? 引言 多阶段构建方式,是在 Dockerfile 中使用多个 FROM 指令,每个 FORM 指令都是一个新的构建阶段,并且可以方便地复制之前阶段的构件.让我们来看一个简单的 Go 程序.代码如下. 点击此处您可以获取代码. 构建 Docker 镜像 让我们来为它构建 Docker 镜像,Dockerfile 文件内容如下. FROM golang:1.19-alpine WORKDIR /build COPY g

  • 使用Docker多阶段构建来减小镜像大小的方法

    本文讲述了如何通过 Docker 的多阶段构建功能来大幅度减小镜像大小,适用于需要在 Dockerfile 中构建程式(如 javac),且需要另外安装编译工具链的镜像.(如 Java) 先来学习单词(本文全部采用中文词汇,如需查询外文文档可对照该词汇表.理论上个人不赞成翻译术语): multi-stage 多阶段 build 构建 image 镜像 stage 阶段 再来看一下效果: 原 110M+,现 92M. 对比一下 Dockerfile 优化前 Dockerfile: FROM ope

  • 优化 Docker 镜像大小常见的方式

    平时我们构建的 Docker 镜像通常比较大,占用大量的磁盘空间,随着容器的大规模部署,同样也会浪费宝贵的带宽资源.本文将介绍几种常用的方法来优化 Docker 镜像大小,这里我们使用 Docker Hub 官方上的 Redis 镜像进行说明. 手动管理 我们能够直接想到的方法就是直接修改官方的 Redis 镜像 Dockerfile 文件,手动删除容器运行后不需要的组件,然后重新构建一个新镜像.这种方法理论上是可行的,但是容易出错,而且效果也不是特别明显.主要是不能和官方的镜像实时同步. 多阶

  • Java应用打包成Docker镜像

    目录 怎么把Java应用打包成Docker镜像? Maven插件构建镜像 用Docker的多阶段构建打包镜像 怎么把Java应用打包成Docker镜像? 对熟悉Docker的同学这应该是一个很简单的问题,把项目打包成JAR包然后在Dockerfile里用ADD命令把JAR文件放到镜像里,启动命令设置执行这个JAR文件即可. 比如一个使用Maven构建的Spring应用就可以用下面这个Dockerfile构建镜像. FROM openjdk:8-jre ADD target/*.jar /appl

  • Dockerfile中multi-stage(多阶段构建)详解

    前言 Docker的口号是Build,Ship,and Run Any App,Anywhere,在我们使用 Docker 的大部分时候,的确能感觉到其优越性,但是往往在我们 Build 一个应用的时候,是将我们的源代码也构建进去的,这对于类似于 golang 这样的编译型语言肯定是不行的,因为实际运行的时候我只需要把最终构建的二进制包给你就行,把源码也一起打包在镜像中,需要承担很多风险,即使是脚本语言,在构建的时候也可能需要使用到一些上线的工具,这样无疑也增大了我们的镜像体积. 在应用了容器技

  • Docker 镜像和容器的区别详解

    最近学习Docker,被Docker 的镜像和容器搞的晕头转向,索性上网查找相关资料并整理下彻底的理解这块内容,有需要的小伙伴可以看下,少走点弯路. Docker的镜像和容器的区别 一.Docker镜像 要理解Docker镜像和Docker容器之间的区别,确实不容易. 假设Linux内核是第0层,那么无论怎么运行Docker,它都是运行于内核层之上的.这个Docker镜像,是一个只读的镜像,位于第1层,它不能被修改或不能保存状态. 一个Docker镜像可以构建于另一个Docker镜像之上,这种层

  • Docker 镜像优化(从1.16GB到22.4MB)

    目录 第一步优化:使用轻量化基础镜像 第二步优化:多阶段构建 Docker 是一个供软件开发人员和系统管理员使用容器构建.运行和与分享应用程序的平台.容器是在独立环境中运行的进程,它运行在自己的文件系统上,该文件系统是使用 docker 镜像构建的.镜像中包含运行应用程序所需的一切(编译后的代码.依赖项.库等等).镜像使用 Dockerfile 文件定义. 术语 dockerization 或 containerization 通常用于定义创建 Docker 容器的过程. 因为容器具备如下优点,

  • 优化Docker镜像安全性的12个技巧总结

    目录 1前言 2避免泄露构建密钥 多阶段构建 BuildKit的密钥 题外话:不要推送在开发机上构建的镜像 3以非root用户身份运行 4使用最新的基础镜像构建和更新系统包 背景知识 6对你的镜像进行漏洞扫描 7扫描你的Dockerfile是否违反了最佳实践 8不要对DockerHub使用Docker内容信任 9扫描你自己的代码是否有安全问题 10使用docker-slim来删除不必要的文件 11使用最小的基础镜像 12使用受信任的基础镜像 背景知识 13测试你的镜像是否能在降低能力的情况下工作

  • 第一次构建、运行、发布、获取docker镜像的步骤详解

    1.前言 过去,如果您要开始编写Python应用程序,第一步就是把Python的运行环境安装到您的机器上,而且安装的环境还要和线上的一致,比较麻烦. 使用Docker,您可以从docker的官方registry或者其他仓库,获取一个可移植的Python运行环境镜像,无需安装.然后,你可以基于这个镜像开发你的应用程序,这样可以确保您的应用程序,依赖项和运行时都一起运行. 2.构建一个python镜像 2.1.为了构建您自己的镜像,首先需要创建一个名称为Dockerfile的文件,用于定义创建镜像并

随机推荐