baicai

白菜

一个勤奋的代码搬运工!

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++ 標準庫
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。