FROM amd64/golang:1.18 AS builder
ENV PROJECT xxx/xxxx/batch
WORKDIR /go/src/$PROJECT
# restore dependencies
COPY go.* ./
RUN go mod download
COPY . .
RUN go build -o /batch
FROM gcr.io/distroless/static AS release
WORKDIR /
COPY --from=builder /batch /batch
USER nonroot:nonroot
ENTRYPOINT ["/batch"]
というようなDockerのマルチステージビルドをして、生成物も出力されているのに、ENTRYPOINTを実行すると
terminated: Application failed to start: "/batch": no such file or directory
ファイルは確かにそこにあるのに、ファイルが見つからないという不思議なエラーになりました。
原因は、RUN CGO_ENABLED=0 go build -o /batchのCGO_ENABLED=0のフラグのつけ忘れでした
distrolessのイメージは無駄なものをそぎ落としすぎており、共有ライブラリが足りない時があるので、このフラグをつけて生成されるバイナリが完全に静的であること、つまり共有ライブラリに依存しないようにする必要があるとのことでした