分阶段构建golang运行环境Dockerfile镜像

news2025/7/28 22:01:45

在开始这项工作之前大家可以先去看一下docker官方给出关于空镜像scratch的说明,采用官方简单的一句话就是:scratch是一个明确的空图像,特别是对于“从头开始”构建图像。

分阶段构建镜像就会用到scratch这个空镜像,这样的好处是可以大大节约服务器资源,比如用普通的镜像(golang:1.18-alpine)来说,它在构建完之后大约占300MB左右,那么我们通过分阶段构建的话可能只需要20MB左右(与你的程序文件以及系统安装的文件内容有关,总之会比原镜像小很多),这里我在想scratch既然是个空镜像干净的环境那么它系统加载的内容也会非常少,在一定程度上是不是也存在提升了程序的性能,这里懂的原理的同学可以交流。

接下来是分阶段构建镜像所用到的Dockerfile和docker-compose.yml以及相关文件的演示:

Dockerfile:

FROM golang:1.18-alpine as builder

# 设置必要的环境变量
ENV GO111MODULE=on \
    CGO_ENABLED=0 \
    GOOS=linux \
    GOARCH=amd64 \
    GOPROXY=https://goproxy.cn,direct

RUN set -ex \
    && sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \
    && apk --update add tzdata \
    && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && apk --no-cache add ca-certificates

# 移动到工作目录:/build
WORKDIR /build

# 将代码复制到容器中
COPY . .

RUN go mod download && go mod tidy -v && go build -o execute .

# 运行阶段指定scratch作为基础镜像
FROM scratch

WORKDIR /app

# 拷贝二进制可执行文件
COPY --from=builder /build/execute buildExecute

# 下载时区包
COPY --from=builder /usr/share/zoneinfo /usr/share/zoneinfo

# 设置当前时区
COPY --from=builder /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

# https ssl证书
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/

# 需要运行的命令
ENTRYPOINT ["./buildExecute"]

docker-compose.yml

version: "3"

services:
  my-golang:
    build: .
    image: golang-1.18-scratch
    container_name: my-golang
    ports:
      - "8888:8888"
    restart: always

编写测试程序main.go

package main

import (
    "github.com/gin-gonic/gin"
)

func InitRoute() *gin.Engine {

    gin.DisableConsoleColor()
    gin.SetMode(gin.ReleaseMode)

    r := gin.Default()

    r.GET("/", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "hello go!",
        })
    })

    return r
}

func main()  {
    r := InitRoute()
    err := r.Run(":8888") //启动监听8888端口
    if err != nil {
        panic(any(err))
    }
}

当前目录结构及文件:

这两个文件都放在项目的根目录之后执行:

docker-compose up -d --build

这时候我们查看执行完毕后的docker容器和镜像信息:

可以看到原镜像golang:1.18-alpine需要328MB空间,而我们通过分阶段构建出来的镜像golang-1.18-scratch仅需要11.4MB,由于我们的测试go程序相对简单,所以占用的空间也是很少的,节省了近30倍的空间,很香吧!

接下来我们检测一下程序是否正常运行:

我们在宿主机curl容器映射出来的8888端口,这个时候收到正确的响应数据,说明我们构建完的镜像已经在正常运行了。

PS:在我们上面的查看执行完毕后的docker容器和镜像信息这一步执行:

为什么出现了这么多none的镜像呢?经过查阅相关资料得知这叫做docker的“悬空镜像”,至于为什么大家可以查询一下相关的资料或者阅读这篇文章《docker的虚悬镜像是什么?》。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/367950.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pnpm / yarn / npm管理依赖包

pnpm pnpm官网:https://pnpm.io/zh/ pnpm安装方式有很多,详见官网。 用最简单的npm来安装pnpm:npm install -g pnpm pnpm安装依赖包 pnpm install # 安装所有项目中的依赖包 pnpm install vue # 安装依赖到dependencies pnpm in…

硬件系统工程师宝典(11)-----去耦电容布局“有讲究”

各位同学大家好,欢迎继续做客电子工程学习圈,今天我们继续来讲这本书,硬件系统工程师宝典。 上篇我们说到在电源完整性分析的目标就是要做到电源的干净、稳定和快速响应,以及针对不同噪声处理的实现方法。今天我们来看看去耦电容…

JS词法环境和执行上下文

前言 JavaScript是一门解释性动态语言,但同时它也是一门充满神秘感的语言。如果要成为一名优秀的JS开发者,那么对JavaScript程序的内部执行原理要有所了解。 本文以最新的ECMA规范中的第八章节为基础,理清JavaScript的词法环境和执行上下文…

嵌入式常问问题和知识

12、并发和并行的区别? 最本质的区别就是:并发是轮流处理多个任务,并行是同时处理多个任务。 你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。 你吃饭吃到一半&…

【ROS学习笔记2】使用vscode开发ROS全流程

【ROS学习笔记2】使用vscode开发ROS全流程 写在前面,本系列笔记参考的是AutoLabor的教程,具体项目地址在 这里 文章目录【ROS学习笔记2】使用vscode开发ROS全流程一、安装终端工具Terminator二、安装VsCode及插件三、使用VsCode开发全流程1、创建工作空…

亚马逊短期疲软,但长期前景乐观

来源:猛兽财经 作者:猛兽财经 由于投资者对亚马逊(AMZN)前景的担忧,导致该公司的股价在过去一年中下跌了39%。然而猛兽财经认为亚马逊近期面临的不利因素只是暂时的,该公司还是有充分的条件可以在医疗保健和物流领域获得重大增长机…

ACM 记忆化搜索

一.记忆化搜索概述 1.概念 搜索是一种简单有效但是效率又很低下的算法结构,其低效的原因主要在于存在很多重叠子问题。而记忆化搜索则是在搜索的基础上,利用数组来记录已经计算出来的重叠子问题状态,进行合理化的剪枝,从而降低时…

高防CDN的知识了解

高防CDN是一种基于CDN(内容分发网络)技术的网络安全服务,旨在提供高级的防御措施来保护网站或应用程序免受DDoS(分布式拒绝服务)攻击和其他网络安全威胁。CDN是一种通过将内容分发到全球多个节点来加速网站或应用程序的…

DBC 文件

概述Vector的DBC文件描述了CAN网络的通信规范,通过定义signal可以表示CAN帧中的各个物理信号的含义。通过CANdb Editor软件可以创建和修改DBC文件,一般监控或控制CAN网络内的节点,不需要解析DBC文件里的全部信息,因为有些信息是给…

前端借助Canvas实现压缩base64图片两种方法

一、具体代码 1、利用canvas压缩图片方法一 // 第一种压缩图片方法(图片base64,图片类型,压缩比例,回调函数)// 图片类型是指 image/png、image/jpeg、image/webp(仅Chrome支持)// 该方法对以上三种图片类型都适用 压缩结果的图片base64与原类型相同// …

02--微信小程序开发流程

开发小程序一般流程:申请小程序帐号安装小程序开发者工具开发小程序提交审核和发布1、注册小程序帐号在微信公众平台官网首页(mp.weixin.qq.com)点击右上角的“立即注册”按钮。2、填写帐号信息 主体为企业时需要一些信息包括:企业…

狂神说:面向对象(一) —— OOP与方法回顾

OOP详解以类的方式组织代码,以对象的方式组织(封装)数据什么是面向对象封装 【口袋装数据,留个口,可以用】继承 【儿子和父亲】多态 【同一个事物表现出多种形态】对象和类实际:先有对象后有类代码&#xf…

商城进货记录交易-课后程序(JAVA基础案例教程-黑马程序员编著-第七章-课后作业)

【实验7-2】商城进货记录交易 【任务介绍】 1.任务描述 每个商城都需要进货,而这些进货记录整理起来很不方便,本案例要求编写一个商城进货记录交易的程序,使用字节流将商场的进货信息记录在本地的csv文件中。程序具体要求如下: …

网络编程NIO

Java NIO(New IO 或 Non Blocking IO)是从Java 1.4 版本开始引入的一个新的IO API,可以替代标准的 Java IO API。NIO 支持面向缓冲区的、基于通道的 IO 操作。NIO 将以更加高效的方式进行文件的读写操作。 非阻塞 IO(NIO) 通过Selector去实…

ASP.NET Core MVC 项目 IOC容器

目录 一:什么是IOC容器 二:简单理解内置Ioc容器 三:依赖注入内置Ioc容器 四:生命周期 五:多种注册方式 一:什么是IOC容器 IOC容器是Inversion Of Control的缩写,翻译的意思就是控制反转。 …

【Azure 架构师学习笔记】-Azure Data Factory (3)-触发器详解-翻转窗口

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Data Factory】系列。 接上文【Azure 架构师学习笔记】-Azure Data Factory (2)-触发器 前言 上文中提到触发器的类型有以下4种,其中第一种【计划】是常用的, 与其他工具/服务类似的方式&#…

游戏、广告作底盘,价值直播为引擎,搜狐活在当下

2022年,中国互联网行业迎来了集体性的“中年危机”。 流量见顶、红利耗尽,再加上疫情的影响,国内互联网企业在过去一年真真实实地感受到了寒气。根据工信部数据,2022年,中国规模以上互联网和相关服务企业总收入达1.46…

【异构图笔记,篇章1】RGCN:Modeling Relational Data with Graph Convolutional Networks

【异构图笔记,篇章1】RGCN:Modeling Relational Data with Graph Convolutional Networks论文信息论文要点快览论文内容介绍背景任务RGCN Conv的介绍RGCN的trick论文实验结果实体分类链路预测评价及总结本文仅供学习,未经同意请勿转载 后期会陆续公开关于…

顺序表的增删查改

数据结构 是数据存储的方式,对于不同的数据我们要采用不同的数据结构。就像交通运输,选用什么交通工具取决于你要运输的是人还是货物,以及它们的数量。 顺序存储结构 包括顺序表、链表、栈和队列等。 例如腾讯QQ中的好友列表,…