Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一套适用于 CI 的 Go项目容器化构建方案

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

作者头像
KevinYan
发布于 2025-03-29 07:48:08
发布于 2025-03-29 07:48:08
10500
代码可运行
举报
文章被收录于专栏:网管叨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
运行
AI代码解释
复制
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
运行
AI代码解释
复制
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
运行
AI代码解释
复制
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
推荐9-一看就懂-Docker容器化
docker的英文意思是 码头工人,意思就是搬运东西的意思,其实这和docker的特点是一样的,docker提供的就是一种容器化搬运东西(我们的软件、程序)的过程。docker自己本来是运行在操作系统上一个程序软件,它会提供一个容器环境,使我们的程序独立地运行在容器中,所以说,官方给docker起的这个名字也真是应景。
猿哥
2019/09/06
7240
Jenkins与Docker的自动化CI/CD实战
在互联网时代,对于每一家公司,软件开发和发布的重要性不言而喻,目前已经形成一套标准的流程,最重要的组成部分就是持续集成(CI)及持续部署、交付(CD)。本文基于Jenkins+Docker+Git实现一套CI自动化发布流程。
星哥玩云
2022/07/28
8290
Jenkins与Docker的自动化CI/CD实战
用 GitHub Action 构建一套 CI/CD 系统
Nebula Graph 最早的自动化测试是使用搭建在 Azure 上的 Jenkins,配合着 GitHub 的 Webhook 实现的,在用户提交 Pull Request 时,加个 ready-for-testing 的 label 再评论一句 Jenkins go 就可以自动的运行相应的 UT 测试,效果如下:
NebulaGraph
2020/05/08
1.2K0
用 GitHub Action 构建一套 CI/CD 系统
使用 GitLab CI 和 Docker 自动部署 Spring Boot 应用
Docker和Spring Boot是非常流行的组合,我们将利用GitLab CI的优势,并在应用程序服务器上自动构建,推送和运行Docker镜像。
民工哥
2020/10/23
3.2K0
使用 GitLab CI 和 Docker 自动部署 Spring Boot 应用
聊聊使用Docker自动化构建及部署测试环境
使用Docker实现自动化构建及部署,需要配置GitHub仓库,设置Secrets,编写CI/CD工作流文件,处理构建、测试、推送、部署的各个阶段,最后验证自动化流程是否生效。还有需要考虑到GitHub Actions的YAML文件格式是否正确,命令是否正确,比如在部署阶段使用ssh连接到服务器执行命令是否正确,是否需要安装特定插件或配置免密登录等。
漫谈测试
2025/03/27
1890
聊聊使用Docker自动化构建及部署测试环境
Docker命令大总结,主要微服务项目部署
3.5 给MySQL挂载本地目录容器不仅仅可以挂载数据卷,也可以直接挂载到宿主机目录上。关联关系如下:
叫我阿杰好了
2022/11/07
1.7K0
Docker命令大总结,主要微服务项目部署
Jenkins实战
需要提一下,现在新安装的没有这个选项,需要在插件里安装一下 Maven Integration
花落花相惜
2021/12/05
1.1K0
jenkins + docker自动化部署maven项目
jenkins安装方式有多种,可以直接安装在服务器上,也可以使用docker拉取jenkins镜像,本文是直接安装到服务器上的方式 linux安装jenkins及相关配置可参考这里 一般来说,jenkins自动部署有下面的方式
Qwe7
2022/03/05
1.7K0
GitLab CI/CD 自动化构建与发布实践
CI/CD 是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法。CI/CD 的核心概念是持续集成、持续交付和持续部署。这篇文章中,我将会介绍基于 GitLab CI/CD 的自动化构建与发布实践。如下图所示,整个流程将分为几个部分:
Se7en258
2021/11/30
5K1
GitLab CI/CD 自动化构建与发布实践
【随手记】GitLab-CI?拿来吧你!
书接【Bug周刊】的gitlab-ci构建部分,我们已经对一个 maven 项目进行了CI构建,实现每次提交代码后自动打包为 jar 包,并在docker in docker 的镜像中 build 为 docker 镜像。避免跳转麻烦,把上文的构建内容放到了基础部分。
客怎眠qvq
2024/03/28
2270
【随手记】GitLab-CI?拿来吧你!
Gitlab+Jenkins+k8s+Helm 的自动化部署实践
本文从实践角度介绍如何结合我们常用的 Gitlab 与 Jenkins,通过 K8s 来实现项目的自动化部署,示例将包括基于 SpringBoot 的服务端项目与基于 Vue.js 的 Web 项目。
kubernetes中文社区
2021/11/12
3.8K0
再见 Jenkins !几行脚本搞定自动化部署,这款神器有点厉害!
Drone是一款基于容器技术的持续集成工具,使用简单的YAML配置文件即可完成复杂的自动化构建、测试、部署任务,在Github上已经有22K+Star。
macrozheng
2021/04/29
1.2K0
【Docker】自定义镜像与Compose
1)在将课前资料中的mysql.tar文件上传到虚拟机,通过load命令加载为镜像
陶然同学
2023/02/27
2.3K0
【Docker】自定义镜像与Compose
CentOS安装Docker
Docker 分为 CE 和 EE 两大版本。CE 即社区版(免费,支持周期 7 个月),EE 即企业版,强调安全,付费使用,支持周期 24 个月。
不吃紫菜
2023/02/13
8.6K0
CentOS安装Docker
掌握这 5 个技巧,让你的 Dockerfile 像个大师!
Docker 是一种容器技术,它可以在操作系统上创建多个相互隔离的容器。容器内独立安装软件、运行服务。
神说要有光zxg
2023/08/29
5930
掌握这 5 个技巧,让你的 Dockerfile 像个大师!
Kubernetes原生CI/CD工具Tekton探秘与上手实践
NOTE: There is an open proposal to deprecate this component in favor of Tekton Pipelines. If you are a new user, consider using Tekton Pipelines, or another tool, to build and release. If you use Knative Build today, please give feedback on the deprecation proposal.
Criss@陈磊
2019/11/13
1.3K0
Kubernetes原生CI/CD工具Tekton探秘与上手实践
Docker 进阶指南(上)- 使用Dockerfile自定义镜像
大家好,我是洋子。上一篇文章《docker 快速入门指南》介绍了Docker的概念,安装Docker方法以及Docker的常用命令,并且在上篇内容当中,我们都是使用docker pull命令直接拉取阿里云镜像仓库里面提供的官方镜像
Bug挖掘机
2022/09/28
1.4K0
Docker 进阶指南(上)- 使用Dockerfile自定义镜像
课件:Docker实用篇
例如一个项目中,部署时需要依赖于node.js、Redis、RabbitMQ、MySQL等,这些服务部署时所需要的函数库、依赖项各不相同,甚至会有冲突。给部署带来了极大的困难。
终有救赎
2023/10/16
3840
课件:Docker实用篇
Node.js 服务 Docker 容器化应用实践
本篇不会讲解 Docker 命令的使用、安装等,因为在之前一篇文章 【一文零基础教你学会 Docker 入门到实践
五月君
2019/09/30
1.8K0
Node.js 服务 Docker 容器化应用实践
应用软件开发的工程化-Python
在 Linux(Ubuntu/Fedora)和 MacOS 下的 Python 开发环境设置步骤
行者深蓝
2023/11/18
3450
推荐阅读
相关推荐
推荐9-一看就懂-Docker容器化
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验