Goで書いたアプリ用のDockerfileの書き方

開発

Goで書いたアプリを実際にデプロイしようとした時にはDockerイメージをビルドして、AWSであればECSやLambda上にデプロイして動かすかと思います。

Goはシングルバイナリで実行可能なので比較的コンテナ化もしやすいですが、マルチステージビルドで最適なコンテナイメージを作成してみましょう。

FROM golang:1.20 AS builder

# Set destination for COPY
WORKDIR /src

# Download Go modules
COPY go.mod go.sum ./
RUN go mod download

# Copy the source code. 
COPY *.go ./

# Build
RUN CGO_ENABLED=0 GOOS=linux go build -o /app ./cmd/main.go

# Deploy the application binary into a lean image
FROM gcr.io/distroless/static-debian12:nonroot AS final

WORKDIR /

COPY --from=builder /app /app

EXPOSE 8080

USER nonroot:nonroot

CMD ["/app"]

builderコンテナでGoのビルドをしてfinalのコンテナにコピーして実行するようにします。

最終デプロイするイメージはdistrolessを使用し、実行ユーザをnonrootにします。

libc/cgoを必要とするアプリの場合は distroless/base を使用します

distrolessはGoogleが用意していてサイズが小さくセキュアなイメージであるということで採用しています。

この記事では、最近Goのアプリをデプロイする時に使っているDockerfileの書き方の紹介でした。

それではまた。

コメント

タイトルとURLをコピーしました