前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >一套适用于 CI 的 Go项目容器化构建方案

一套适用于 CI 的 Go项目容器化构建方案

作者头像
KevinYan
发布2025-03-29 15:48:08
发布2025-03-29 15:48:08
6500
代码可运行
举报
文章被收录于专栏:网管叨bi叨网管叨bi叨
运行总次数:0
代码可运行

Go实战专栏的项目到这里,在功能上的开发已经全部完成,接下来我们花两节讲一下Go项目的容器化部署。

想要把让项目能在容器中运行,首先得把它打包到对应的Docker镜像里才行,而且一般公司部门中都会有类似CI、CD工具负责对项目进行构建和部署。

CI任务负责根据代码仓的tag拉取对应版本的代码,而后构建出Go项目的二进制运行文件再把运行文件打包到项目的Docker镜像中,CD任务则会把项目部署到服务K8s集群约定的地方上去运行。

那么这一节我们就来聊一聊在CI任务中怎么把我们项目指定版本的代码构建成能运行服务容器的Docker镜像,这里主要分享的还是思路,具体在CI工具中怎么配置任务还要看所使用的CI工具以及需求再做调整,有可能会跟今天给出的方案不完全一样,但是整体思路还是不会有太大偏差的。

项目构建Docker镜像的思路

Go项目想容器化部署需要先把项目构建打包成Docker镜像,这里分享一个可以拉取 go-mall项目不同tag版本代码构建项目Docker镜像的方法。

这里我们使用Docker的多阶段打包功能:

  • 一阶段:拉取指定版本的代码,把Go项目的代码编译成二进制文件
  • 二阶段:把上阶段变异好的项目二进制文件放到一个更基础的镜像中,这既能减少要运行项目容器的镜像的尺寸,又因为镜像中没有拉取和构建代码的那些依赖(go 环境、拉代码用的ssh key等),让容器的安全性更高。

整个Dockerfile的明细如下:

这里我们在镜像中用ARG命令种下了两个构建参数

  • SSH_PRIVATE_KEY
  • GIT_TAG

它们需要我们执行docker build 时把代码的tag版本号还有自己的SSH 私钥传给镜像,这样就能让Docker拉取对应版本的代码了。在Docker中拉取代码使用的是机器上的私钥(这里的机器指的是咱们自己的电脑,在公司的系统环境里就是专门做CI的机器,或者配置到Jenkins的配置项),除了用ssh key 外还可以使用 GitHub / GitLab Token作为拉取代码时的身份凭证。

构建 Docker 镜像

docker build 命令构建镜像时我们需要使用 --build-arg参数传递 SSH 私钥和 Git tag:

运行 dokcer build 前记得把工作目录切换到Dockerfile所在的位置

代码语言:javascript
代码运行次数:0
运行
复制
docker build \
  --build-arg SSH_PRIVATE_KEY="$(cat ~/.ssh/id_rsa)" \
  --build-arg GIT_TAG=c5 \
  -t go-mall:v5 .

这里我们使用的是c5 这个代码版本: https://github.com/go-study-lab/go-mall/releases/tag/c5

为啥用这个版本呢,因为c6的代码在容器里运行还需要连接数据库,这个我们放到下节在K8s上运行项目上再做。

运行Go项目Docker 容器

项目的镜像有了,接下来我们可以使用镜像运行容器做一下测试,运行容器的命令如下,每个参数的具体作用我都写在了注释里,一看便知。

代码语言:javascript
代码运行次数:0
运行
复制
docker run -d  \ # -d 参数让docker在后台运行
-p 8080:8080 \ # 映射容器端口8080到宿主机的8080端口 
-v /tmp/applog:/home/applog/ \ # 把容器里的日志目录挂载到本地电脑的/tmp/applog目录上
-e ENV=test --rm \ # 指定环境变量, 关闭容器时删除容器
--name go-mall \ # 指定容器名
go-mall:v5 # 要运行的镜像名

运行容器后,你可以使用以下命令检查容器是否正在运行:

代码语言:javascript
代码运行次数:0
运行
复制
docker ps

这个命令会列出所有运行中的容器。如果容器成功运行,你会看到类似下面的输出:

这里运行容器时我们指定的ENV环境变量是test,所以项目在启动时会加载config/application.test.yaml 配置文件。

在这个配置文件里我们设置的项目应用日志的路径是:"/home/applog/go-mall/go-mall.log"

这个目录在容器中,不过我们在运行时使用 -v /tmp/applog:/home/applog/ 把它挂载到了电脑的/tmp/applog目录下,这里我们访问一个测试接口看下效果。

直接访问c5 代码版本里的接口,然后去我们电脑的/tmp/applog 目录下验证一下成果。

可以看到容器中的应用日志能正常地收集到外部挂载的日志文件中。

总结

本节中使用的Dockerfile以及操作命令我上传到了项目仓库的WIKI里,可直接拿来使用。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-03-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 网管叨bi叨 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 项目构建Docker镜像的思路
  • 构建 Docker 镜像
  • 运行Go项目Docker 容器
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档