docker golang:alpine CGO 制作镜像的正确姿势

当程序需要引入 C/C++ 库（比如支持 Sqlite 数据库）的时候，编译环境需要打开 CGO，否则打包完成后的程序就不能顺利运行（数据库初始化失败）。

这时就需要安装 build-base 配置编译环境。

参考 Dockerfile 如下：

Copy
FROM golang:alpine as builder
ENV CGO_ENABLED=1
WORKDIR /app
COPY . .
RUN apk add --no-cache --update git build-base
RUN go mod tidy \
&& go build -o api_client_linux ./cmd/api_client/

FROM alpine:latest as runner
ENV TZ=Asia/Shanghai
RUN apk --no-cache add ca-certificates tzdata libc6-compat libgcc libstdc++
WORKDIR /app

COPY --from=builder /app/api_client_linux .
VOLUME /app/conf
EXPOSE 8080

ENTRYPOINT ["./api_client_linux" ,"-c","/app/conf/config.yaml"]

运行镜像我们也使用 Alpine ，由于 Alpine 极为精简，并没有常用的时区、证书等，会导致不可预料的错误。所以我们需要安装这些东西：

包名 | 用途
ca-certificates: | CA 证书，使用 TLS
tzdata: | 时区配置
libc6-compat: | C 标准库
libgcc: | GCC 相关库，CGO 编译程序依赖
libstdc++: | C++ 标准库