前言
今年开始接触并且实践到Golang,近期自己写了一个相册的服务,是基于前后端分离的模式,由Go提供rest给web页面使用。在项目前期是直接使用的打包完成的二进制文件执行,在管理方面存在一些不方便的地方,所以周末抽时间将其容器化,实现自动化的部署方案,主要就是采用coding的devops流程,容器化使用的还是docker容器,使用的是alpine的镜像,在这个过程中遇到一些问题,下面会详细讲出,以此记录。
docker容器化过程
将服务自动化发布流程还是比较简单的,分为以下几步:
1、github上创建对应的代码仓库,作为源代码的提交
2、在coding上新建一个项目,与github的代码库绑定(github同时也提供github action,也是非常好用的,但是我的服务器主机都在国内,所以涉及到一个跨境网络同步延时很高的问题)
3、在创建的项目中有个持续集成-构建计划,此时就是自己编写对应的jenkins文件,当代码有更新时,会自动hook到流程中,执行对应的build/deploy过程
4、完成deploy过程后,检查对应容器的服务状态以及接口状态是否ok,整个自动化发布流程算是结束。
go-web在使用alpine过程中出现的问题
Q1 and A
在启动容器时,一直启动不成功,提示standard_init_linux.go:211: exec user process caused "no such file or directory"
,这个问题查了一下google,发现是一个非常基本的问题,有很多的blog上都有这样的问题,
原因是由于go动态引用了特殊的包,在alpine的包中不存在的问题,详情可以查看,解决方案也很简单,在build时,加个参数即可:-tags netgo
,打包时就用命令GOARCH=amd64 go build -tags netgo -o app
即可。
Q2 and A
启动容器后,日志一切正常,但是访问接口无论如何也访问不通,当执行curl localhost:8111
时,提示curl: (56) Recv failure: Connection reset by peer
,此时查看容器的端口映射情况,也是正常映射的:0.0.0.0:8111->8111/tcp, :::8111->8111/tcp
,
然后查看我的config配置,发现有一行是host的地址,我填的是127.0.0.1
,然后将它修改为0.0.0.0
后,外部服务正常可以访问,发现在容器内部127.0.0.1
的地址可以直接访问通,当在宿主机进行访问时,即使端口映射是对的也是访问不通的,当改成0.0.0.0
后,有端口映射的情况是可以访问通的,代表发布到外部访问
总结
遇到的都是两个小问题,解决和查文档,思考的过程中也是很快的,在计算机的世界里很多都是相通的,所谓好记性不如烂笔头,所以将其记录。如果有更多想要交流的,欢迎联系我,可以直接给我发邮件:songbo2021@outlook.com。