前言
有一位朋友看了 Docker私有仓库搭建&Go服务部署之后就在自己的项目中开发环境用上了, 然后现在项目要部署到测试及生产环境, 因为他们之前的项目没用docker且go的版本为1.12, 当前项目的环境为go 1.14, 老大要求每个项目的环境必须隔离, 打包也必须要镜像内打包(避免人工打包失误), 这位朋友在容器内打包的时候遇到了挺麻烦的问题求助了一下我, 所以就有了这篇文章
上次讲的是开发环境自己在本地打包然后把二进制放在镜像里运行, 方便快捷, 这次线上环境要在容器内用go打包二进制运行文件的话就需要对应的环境和依赖安装了, 包管理的话还是建议go mod, 个人感觉方便好用
在 alpine 上打包运行go服务
之前的Dockerfile是这样
# 设置基础镜像
FROM golang:1.14.4-alpine
# 作者描述信息
LABEL maintainer="飞啊飞"
# 使用国内源
RUN echo -e http://mirrors.aliyun.com/alpine/v3.7/main/ > /etc/apk/repositories
# copy当前目录的文件到镜像里面的工作目录目录下
COPY ./config/test.json /demo/ // 配置文件
COPY server /demo/ // 打包的linux二进制文件
#设置东八区,北京时间
ENV TZ=Asia/Shanghai
RUN apk add --no-cache tzdata && ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 指定路径
WORKDIR /demo/
# 执行命令 这里给文件增加执行权限
RUN ["chmod", "+x", "/demo/server"]
# 容器入口, 执行命令
CMD ["./server", "-config", "test.json"]
因为服务器版本的问题, 所以需要在docker内打包部署, 奉上一份正确的Dockerfile, 然后下面说遇到的问题
# 设置基础镜像
FROM golang:1.14.4-alpine
# 作者描述信息
LABEL maintainer="飞啊飞"
# copy整个项目
COPY ./config/test.json /demo/ // 配置文件
COPY . /demo/ // 项目文件
# 使用阿里源&&设置东八区,北京时间
ENV TZ=Asia/Shanghai
RUN echo -e http://mirrors.aliyun.com/alpine/v3.10/main/ > /etc/apk/repositories \
&& apk update \
&& apk add --no-cache tzdata gcc g++ libffi-dev musl-dev openssl-dev make linux-headers libc-dev libc6-compat binutils \
&& ln -sf /usr/share/zoneinfo/$TZ /etc/localtime \
&& echo $TZ > /etc/timezone
# 指定路径
WORKDIR /demo/
# 打包二进制&&增加执行权限
RUN export GOPROXY=https://mirrors.aliyun.com/goproxy/ \
&& go mod tidy \
&& export GOARCH=amd64 \
&& export GOOS=linux \
&& go build -o server ./main.go \
&& chmod +x server
# 容器入口, 执行命令
CMD ["./server", "-config", "test.json"]
说一下主要的两个坑
参考一:
https://stackoverflow.com/questions/53964313/error-compiling-go-from-source-in-an-alpine-docker-container-loadinternal-can
cgo在alpine 上运行需要依赖musl_dev 这个包, 在Dockerfile中加入后还是不行
参考二:
https://github.com/zmap/zlint/issues/316
问题定位到了, 需要binutils 包的版本大于2.32并且 alpine 的版本大于等于 3.10, 我之前仓库用的是alpine 3.7版本的, 下载的binutils 包版本太低, 所以把阿里源的仓库版本改为3.10就好了, 问题解决
总结
找这种问题还是挺费劲的, 所以在此记录一下, 与人方便与己方便
在 CentOS 9 x64 系统上,可以通过以下步骤来部署 Golang 服务。安装必要的软件包、编译应用、配置 Supervisor、配置 Nginx。
目前go语言不仅在阿里集团内部,在整个互联网行业内也越来越流行,本文把高德过去go服务开发中的性能调优经验进行总结和沉淀,希望能为正在使用go语言的同学在性能优化方面带来一些参考价值。
go项目运行之后,修改.env文件不会立即生效,需要重启go服务才会生效;go项目运行之后,修改config.ini配置文件会立即生效,无需重启go服务
REST即表述性状态传递(英文:Representational State Transfer,简称REST),它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性
IOC(inversion of control)即控制反转,是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。IOC-golang 是一款服务于Go语言开发者的依赖注入框架,基于控制反转思路,方便开发人员搭建任何 Go 应用。在本文中,我不会罗列这个项目的种种功能与实现,而是站在开发者的角度,谈一谈我认为 Go 应用开发的“理想姿态”。