プログラムが 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++ 標準ライブラリ |