docker golang:alpine CGO 制作镜像的正确姿势
当程序需要引入C/C++库(比如支持Sqlite数据库)的时候,编译环境需要打开CGO,否则打包完成后的程序就不能顺利运行(数据库初始化失败)。
这时就需要安装 build-base 配置编译环境。
参考 Dockerfile 如下:
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++ 标准库文章来源:
Author:白菜
link:https://blog.baicai.me/article/2023/docker_golang_alpine_cgo_build/
上一篇:网站迁移完成