在Alpine系统中使用CGO的方法
Oct. 4, 2022
Go的静态编译十分方便。
Go编译后的二进制需要glibc。glibc是一种标准C运行库,如果我换用其他的标准C运行库,比如musl,会导致编译后的二进制无法顺利运行。
如果代码中完全没有使用C,则可以禁止CGO,避免链接glibc。
CGO_ENABLED=0 go build -a -installsuffix cgo
如果我使用了一些C/C++库,则不能禁用 CGO 。这时候,只能手动安装glibc来让二进制文件顺利运行。
在Alpine系统中,使用包管理器安装所需的glibc。
包名 用处
ca-certificates [可选] CA 证书,方便使用 TLS
tzdata [可选] 时区配置,方便 GORM 等需要处理时间的场景
libc6-compat [必选] C 标准库
libgcc [必选] GCC 相关库,CGO 编译的程序会依赖
libstdc++ [必选] C++ 标准库
完整版 Dockerfile 如下:
FROM golang:1.12.2-alpine3.9 AS builder
RUN apk --no-cache add build-base
COPY . /code
RUN mkdir -p /usr/local/go/src/github.com/zjyl1994 && \
ln -s /code /usr/local/go/src/github.com/zjyl1994/app && \
cd /usr/local/go/src/github.com/zjyl1994/app && \
CGO_ENABLED=1 go build -a
FROM alpine:latest
RUN apk --no-cache add tzdata ca-certificates libc6-compat libgcc libstdc++
COPY --from=builder /usr/local/go/src/github.com/zjyl1994/app/app /app/app
CMD ["/app/app"]