使用Docker构建Golang调用C/C++库

最近在使用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"]

标签:go