当前位置: 首页 > news >正文

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

在开始这项工作之前大家可以先去看一下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,directRUN 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 scratchWORKDIR /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-scratchcontainer_name: my-golangports:- "8888:8888"restart: always

编写测试程序main.go

package mainimport ("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.lryc.cn/news/18722.html

相关文章:

  • Vue-cli脚手架在做些什么(源码角度分析)
  • 【Nginx】|入门连续剧——安装
  • 从0开始学python -38
  • 算法设计与分析期末考试复习(二)
  • 九龙证券|4D毫米波雷达成市场新宠,相关概念股大涨,会贡献多少业绩?
  • Git天天用,不得不看的那些事
  • IDE 文档注释使用,模板注释,ide配置templates
  • 力扣-查询近30天活跃用户数
  • 企企通聚源池| 聚合海量资源全网寻源,赋能供采双方撮合交易
  • 【算法数据结构体系篇class09】:链表问题:快慢指针、回文结构、复制、中点,分区、相交
  • 实验室信息化管理行业方案
  • docker学习
  • Linux 常用命令
  • 数据结构-顺序表(2)
  • 初学C/C++内存管理--new和delete的使用
  • 【Java】volatile
  • 混沌工程 Chaos Mesh 实践经验(持续更新)
  • 追梦之旅【数据结构篇】——详解C语言实现链栈
  • oracle数据库常用操作
  • 一文教会你如何在Linux系统中使用Docker安装Redis 、以及如何使用可视化工具连接【详细过程+图解】
  • mysql 内存架构
  • Helm安装Harbor
  • 梯度下降优化器:SGD -> SGDM -> NAG ->AdaGrad -> AdaDelta -> Adam -> Nadam -> AdamW
  • Ubuntu下gcc多版本管理
  • 吃透8图1模板,人人可以做架构
  • 骨传导耳机推荐哪款好,列举几款是市面上热销的骨传导耳机
  • CFS三层内网渗透
  • SQL server设置用户只能访问特定数据库、访问特定表或视图
  • linux:http服务器搭建及实验案例
  • 【无标题】智能工业安全用电监测与智慧能源解决方案