2021年9月

最近在使用Golang集成虹软Linux SDK时,发现不能单纯的设置CGO_ENABLED=0,这样会导致C/C++库调用出错,无法完成正常的编译,因为你需要引入C/C++库的时候,不能禁用CGO。

而且虹软Linux SDK只能在Linux平台编译,macOS上缺少必须的glibc库,所以使用Docker是最好的方案,好在Docker社区的强大,几乎你需要的所有环境都有对应的官方镜像,这里推荐golang:alpine作为基础镜像,这个镜像包含了基础的Golang运行环境和可供编译C/C++的Linux环境,如果有缺少的参数可以自行添加。

为了减少最终镜像体积,可以分阶段构建,大概的Dockerfile如下:

# 使用基础镜像构建
FROM golang:1.15-alpine AS build
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
RUN apk add libc6-compat libgcc libstdc++
ENV GO111MODULE=on \
    GOPROXY=https://goproxy.cn,direct \
    GOOS=linux \
    GOARCH=amd64
WORKDIR /build
COPY lib /usr/
COPY go.mod .
COPY go.sum .
RUN go mod download
COPY . .
RUN go build -o face
# 使用轻量化镜像运行减少体积
FROM scratch as final
ENV TZ=Asia/Shanghai
COPY --from=build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
COPY --from=build /usr/share/zoneinfo /usr/share/zoneinfo
COPY --from=build /build/face /
COPY --from=build /build/.env /face.env
ENTRYPOINT ["/face"]

最近一个项目使用Docker来部署的,但每次手动部署都需要先把代码拉取到本地,然后在执行命令删除原来的容器和镜像,最后再部署,非常繁琐,所以直接把这些命令放在一个Shell脚本内,实现一键部署,代码如下:

# 指定代码目录
codePath="/root/";
# 接收输入,形如:  xxx.sh projectName
project=$1;
if [ ! -n "$1" ] ;then
  projectName="projectName";
fi
cd $codePath$projectName
echo "git pull start" ;
# 拉取最新代码
git pull origin master
echo "git pull finish" ;

echo "Docker build start" ;
# 停止容器、删除容器、删除镜像
docker stop app
docker rm app
docker image rm app
docker build . -t app
echo "Docker build finish" ;

echo "Docker deploy start" ;
# 开始部署
docker run -d --name app --network host --restart=always -v ~/app.env:/app.env app
echo "Docker deploy finish" ;

自此一个半自动部署脚本完成,后续有时间再把脚本和Jenkins集成到一起,就可以实现定时或者提交后自动部署了。