多阶段构建Golang程序Docker镜像方法详解

2023-11-05

为什么要多阶段构建

大家都知道Golang是编译型语言,源码需要先编译再运行,编译过程中需要下载依赖包,最终编译成可执行的二进制文件,只需要部署这个二进制文件即可运行。

现在基本都是采用容器化部署方式,打包出的镜像体积越小越好,和程序运行无关的东西越少越好。所以打包Golang程序Docker镜像时,最好的做法是只将编译好的Golang程序二进制文件打包进镜像即可。

如果要做到这一点的话,就需要使用多阶段构建Docker镜像方法了。首先基于一个有Golang编译环境的基础镜像编译出Golang程序的二进制文件,然后将二进制文件打包到用于运行环境的基础镜像中。

代码示例

FROM golang:1.19 AS builder
WORKDIR /project
ADD . .
RUN go build main.go

FROM debian:stable-slim  
WORKDIR /app
COPY --from=builder /project/main .
CMD ["./app/main"]  

语法非常简单,需要注意两个点:

  • From,开启一个新的build阶段,可以使用as为当前stage指定一个名字,如果没有指定名字的话默认从0开始;
  • Copy,默认从本地目录复制文件或文件夹到docker image,如果有--from,则会从指定的docker stage或其他docker image中复制,例如--from=builder、--from==0(没有使用as为当前stage命名的情况下默认为0)。

小结

多阶段构建Docker镜像有如下几点好处:

  • 减小镜像体积:多阶段构建可以在一个Dockerfile文件中使用多个FROM指令从不同的镜像中构建不同阶段的镜像,在最后一阶段中只保留应用程序所需的文件和运行时环境,减小了镜像的大小。
  • 提高构建效率:在多阶段构建中,因为只需要在最后一阶段中打包需要的文件,从而避免了在构建过程中不必要的文件和依赖项,并且避免了为每个构建层创建新的容器。
  • 更易维护:多阶段构建可以将不同的构建阶段独立出来,从而简化了维护过程。如果需要更改其中一个阶段,那么只需要改变该阶段的Dockerfile文件即可。
  • 更安全:多阶段构建可以避免同时在一个容器中安装和运行多个不同的应用程序和软件工具所带来的潜在安全风险。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多阶段构建Golang程序Docker镜像方法详解 的相关文章

随机推荐

  • Excel基础操作

    目录 第一节 新建Excel工作簿 第二节 认识Excel操作界面 第三节 上下文选项卡和自定义功能区 第四节 文件选项卡的设置 第五节 输入和编辑数据 第六节 数据的显示 第七节 数据输入技巧 第八节 填充与序列 第九节 填充选项 第十节
  • LVGL学习 stm32f407-board-lvgl v8.3移植

    LVGL学习 stm32f407 board lvglv8 3移植 移植过程有问题 请参考正点原子的教程或者视频 硬件平台 STM32F407ZGT6核心板 3 2寸屏幕 LVGL LVGL Light and Versatile Grap
  • CloudCompare 二次开发(3)——计算点云质心

    目录 一 概述 二 代码集成 三 结果展示 一 概述 不依赖任何第三方点云相关库 使用ClopudCompare计算点云质心 本文由CSDN点云侠原创 原文链接 爬虫网站自重 二 代码集成 1 mainwindow h文件public中添加
  • Python数据分析是什么?为什么要对比Excel学习

    Python本身是一门编程语言 应用于Web开发 爬虫 机器学习等多个领域 但是除了这些 今天小千要告诉你Python大热的一个学习方向 那就是Python数据分析 我常常会听到这样的问题 金融分析中 为什么我要学习像Python这样的编程
  • H5跳转微信小程序,通过获取URL Scheme,实现短信跳转小程序,微信跳转小程序,邮件跳转小程序,外部链接跳转小程序

    H5链接跳转小程序有2种方式 第一种 通过微信官方提供的标签wx open launch weapp 打开小程序 第二种 通过获取URL Scheme实现链接跳转小程序 一 wx open launch weapp 官方文档https de
  • java 读取word_java poi word读取

    用 poi 读取word文件 老是报错 org apache poi poifs filesystem NotOLE2FileException Invalid header signature read 0xC9D33C3A6D6F724
  • 期货开户的具体程序是什么?

    一 开户 1 对客户的条件要求 客户应至少具备以下条件 1 具有完全民事行为能力 2 有与进行期货交易相适应的自有资金或者其他财产 能够承担期货交易风险 3 有固定的住所 4 符合国家 行业的有关规定 二 保证金 中小投资者可以等待股指期货
  • tinyMCE编辑器去除换行增加的P标签

    tinyMCE编辑器去除换行增加的P标签 tinyMCE里使用回车后会加P标签 如何变成原本的br标签呢 搜索出force p newlines false参数可以关闭自动添加P标签 但实际测试没什么变化 查询了一下源码发现带 p 的就fo
  • 视差动画 - 雅虎新闻摘要加载

    基础知识 继 Android实现旋转动画的两种方式 我们了解了 Android实现旋转的两种基本方法之后 我们来写一个综合案例 效果展示 代码实现 实现思路 从效果中我们可以看到 可以将其分为三个动画 1 旋转动画 Android实现旋转动
  • linux桌面小程序开发(pyqt+新增csv增删改查功能)附加章节

    温馨提示 默认运行的是GPU 若发现无法执行 请在参数中替换为CUP 在上一版中需要用到sql 但在这一版中我全部改为了csv进行一个文件的匹配 所以不再需要装mysql了 还有创建字段啥的了 我更新了该小程序的功能 增加了csv文件的增删
  • Logseq 本地端使用 Github 同步

    2020 11 25 更新 Logseq 的网页端同步 Github 有很多 BUG 难以正常使用 解决办法见另一篇文章 Logseq 利用 Obsidian 多端同步 目录 2020 11 25 更新 一 需求分析 二 基本思路 1 Lo
  • HUAWEI MateBook X Pro升级2T SSD并保留一键恢复功能

    手上一台 MateBook X Pro2020款笔记本 SSD为512G 用了几年 随着时间的推移 硬盘空间慢慢不够用了 系统分区与用户分区在WIN10系统下都显示为红色警告 因此有了升级SSD的想法 上网查了很多资料 大多数都有提到Mat
  • NodeJs - for循环的几种遍历方式

    NodeJs for循环的几种遍历方式 一 for循环的几种遍历方式 1 1 遍历的目标不一样 1 2 空属性的遍历 1 3 异步的调用 二 总结 一 for循环的几种遍历方式 我们先来看下for循环的4种不同遍历方式 const arr
  • flutter 屏幕适配插件 flutter_screenutil 的简单使用

    前言 屏幕适配问题一直是app开发中一个绕不开的话题 毕竟现在各种尺寸的设备越来越多 原本一个优美大气的用户页面可能就会因为屏幕尺寸变化而变得杂乱无章 甚至是布局溢出 导致某些重要的信息无法显示 最终并因此而丢失掉用户 因此 屏幕适配是一项
  • DNS请求流程和报文解析

    DNS 域名系统 英文 Domain Name System 缩写 DNS 是互联网的一项服务 它作为将域名和 IP 地址相互映射的一个分布式数据库 能够使人更方便地访问互联网 DNS 的作用是将人类可读的域名 如 www example
  • QT QMap-QMultiMap类实现一键多值的具体应用 (**)

    QT QMap QMultiMap类实现一键多值的具体应用 1 QMap 和 QMultiMap 都具有 一键多值 只是它们的成员函数有些不同 QT QMap QMultiMap类实现一键多值的具体应用 QT QMap QMultiMap类
  • 分数的拆分原理和方法_大梦简书——分数巧算(已更新分数裂项)

    今天大梦老师给大家梳理一下目前阶段会用到的分数巧算 这个也是拖更很久了 今天也终于在寒假上课前有机会给大家系统的写一写 依然是会一直更新的一个帖子 更新日志 19 2 28 更新分数裂项 小升初重点 已标红 PS 注意只有从微信公共号底端菜
  • 卷积神经网络(CNN)

    卷积神经网络 Convolutional Neural Network 简称CNN 是一种前馈神经网络 人工神经元可以响应周围单元 可以进行大型图像处理 卷积神经网络包括卷积层和池化层 在影像处理中 一张图片会被处理成三维矩阵 图片的长宽和
  • 使用jquery解析XML的方法,很简单

    尽量使用高版本的的jquery 有的jquery版本会报没有parseXML属性的错误 我用的jquery 1 7 2 min js xml文件格式
  • 多阶段构建Golang程序Docker镜像方法详解

    为什么要多阶段构建 大家都知道Golang是编译型语言 源码需要先编译再运行 编译过程中需要下载依赖包 最终编译成可执行的二进制文件 只需要部署这个二进制文件即可运行 现在基本都是采用容器化部署方式 打包出的镜像体积越小越好 和程序运行无关