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

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

作者头像
KevinYan
发布于 2025-03-29 07:48:08
发布于 2025-03-29 07: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
运行
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
聊聊使用Docker自动化构建及部署测试环境
使用Docker实现自动化构建及部署,需要配置GitHub仓库,设置Secrets,编写CI/CD工作流文件,处理构建、测试、推送、部署的各个阶段,最后验证自动化流程是否生效。还有需要考虑到GitHub Actions的YAML文件格式是否正确,命令是否正确,比如在部署阶段使用ssh连接到服务器执行命令是否正确,是否需要安装特定插件或配置免密登录等。
漫谈测试
2025/03/27
1120
聊聊使用Docker自动化构建及部署测试环境
写个简单的项目自动部署脚本
在项目数量比较大和构建流程比较复杂的场景,我们一般会使用jenkins以及衍生产品来实现构建打包部署能力,但对于一些简单的项目和小众场景,我们使用简单的脚本构建部署,也未必不是一个简单便捷和节省成本的选择。
叔牙
2024/05/21
4530
写个简单的项目自动部署脚本
Docker Getting started with Java
Docker 官网提供了 python,nodejs,java 3种不同编程语言的 Language-specific guides 学习指南。该指南详细说明了如何编写 Dockerfile 文件,部署 Docker 容器以及构建 CI/CD pipline。
Se7en258
2021/05/18
1.9K0
Docker Getting started with Java
应用软件开发的工程化-Python
在 Linux(Ubuntu/Fedora)和 MacOS 下的 Python 开发环境设置步骤
行者深蓝
2023/11/18
2740
应用软件开发的工程化-Go
在 Linux(Ubuntu/Fedora)和 MacOS 下的 Go 开发环境设置步骤如下:
行者深蓝
2023/11/18
2540
使用 GitLab CI 和 Docker 自动部署 Spring Boot 应用
Docker和Spring Boot是非常流行的组合,我们将利用GitLab CI的优势,并在应用程序服务器上自动构建,推送和运行Docker镜像。
民工哥
2020/10/23
3.1K0
使用 GitLab CI 和 Docker 自动部署 Spring Boot 应用
Jenkins与Docker的自动化CI/CD实战
在互联网时代,对于每一家公司,软件开发和发布的重要性不言而喻,目前已经形成一套标准的流程,最重要的组成部分就是持续集成(CI)及持续部署、交付(CD)。本文基于Jenkins+Docker+Git实现一套CI自动化发布流程。
星哥玩云
2022/07/28
7570
Jenkins与Docker的自动化CI/CD实战
Gitlab+Jenkins+k8s+Helm 的自动化部署实践
本文从实践角度介绍如何结合我们常用的 Gitlab 与 Jenkins,通过 K8s 来实现项目的自动化部署,示例将包括基于 SpringBoot 的服务端项目与基于 Vue.js 的 Web 项目。
kubernetes中文社区
2021/11/12
3.7K0
推荐9-一看就懂-Docker容器化
docker的英文意思是 码头工人,意思就是搬运东西的意思,其实这和docker的特点是一样的,docker提供的就是一种容器化搬运东西(我们的软件、程序)的过程。docker自己本来是运行在操作系统上一个程序软件,它会提供一个容器环境,使我们的程序独立地运行在容器中,所以说,官方给docker起的这个名字也真是应景。
猿哥
2019/09/06
7040
【随手记】GitLab-CI?拿来吧你!
书接【Bug周刊】的gitlab-ci构建部分,我们已经对一个 maven 项目进行了CI构建,实现每次提交代码后自动打包为 jar 包,并在docker in docker 的镜像中 build 为 docker 镜像。避免跳转麻烦,把上文的构建内容放到了基础部分。
客怎眠qvq
2024/03/28
1800
【随手记】GitLab-CI?拿来吧你!
Jenkins实战
需要提一下,现在新安装的没有这个选项,需要在插件里安装一下 Maven Integration
花落花相惜
2021/12/05
1K0
课件:Docker实用篇
例如一个项目中,部署时需要依赖于node.js、Redis、RabbitMQ、MySQL等,这些服务部署时所需要的函数库、依赖项各不相同,甚至会有冲突。给部署带来了极大的困难。
终有救赎
2023/10/16
3220
课件:Docker实用篇
GitLab CI/CD 自动化构建与发布实践
CI/CD 是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法。CI/CD 的核心概念是持续集成、持续交付和持续部署。这篇文章中,我将会介绍基于 GitLab CI/CD 的自动化构建与发布实践。如下图所示,整个流程将分为几个部分:
Se7en258
2021/11/30
4.9K1
GitLab CI/CD 自动化构建与发布实践
掌握这 5 个技巧,让你的 Dockerfile 像个大师!
Docker 是一种容器技术,它可以在操作系统上创建多个相互隔离的容器。容器内独立安装软件、运行服务。
神说要有光zxg
2023/08/29
5680
掌握这 5 个技巧,让你的 Dockerfile 像个大师!
jenkins + docker自动化部署maven项目
jenkins安装方式有多种,可以直接安装在服务器上,也可以使用docker拉取jenkins镜像,本文是直接安装到服务器上的方式 linux安装jenkins及相关配置可参考这里 一般来说,jenkins自动部署有下面的方式
Qwe7
2022/03/05
1.6K0
Docker命令大总结,主要微服务项目部署
3.5 给MySQL挂载本地目录容器不仅仅可以挂载数据卷,也可以直接挂载到宿主机目录上。关联关系如下:
叫我阿杰好了
2022/11/07
1.7K0
Docker命令大总结,主要微服务项目部署
再见 Jenkins !几行脚本搞定自动化部署,这款神器有点厉害!
Drone是一款基于容器技术的持续集成工具,使用简单的YAML配置文件即可完成复杂的自动化构建、测试、部署任务,在Github上已经有22K+Star。
macrozheng
2021/04/29
1.2K0
04.使用 github actions+docker 自动部署前后端分离项目 zhontai (.net core+vue)
经过一番尝试学习,个人感受是其功能齐全,文档完善,使用 GitHub 托管仓库完成自己的 CI/CD,不再需要自己搞构建服务了。 关于使用费用问题:每个用户/组织都有免费的使用额度:2000 分钟/月, 不同的项目归类到不同的组织,完全足够使用了。
易墨
2023/08/28
9910
04.使用 github actions+docker 自动部署前后端分离项目 zhontai (.net core+vue)
Docker容器化部署,这些最佳实践你不可不知
Docker 作为一种开源的容器化技术,在当今的软件开发和部署领域中发挥着至关重要的作用。它具有诸多显著优势,为开发者和运维人员带来了极大的便利。
天创项目管理分享
2024/11/20
5450
Docker容器化部署,这些最佳实践你不可不知
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.2K0
Kubernetes原生CI/CD工具Tekton探秘与上手实践
推荐阅读
相关推荐
聊聊使用Docker自动化构建及部署测试环境
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文