當程式需要引入 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++ 標準庫 |