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にします。
distrolessはGoogleが用意していてサイズが小さくセキュアなイメージであるということで採用しています。
Build your Go image
Learn how to build your first Docker image by writing a Dockerfile
https://github.com/GoogleContainerTools/distroless/blob/main/examples/go/Dockerfile
この記事では、最近Goのアプリをデプロイする時に使っているDockerfileの書き方の紹介でした。
それではまた。
コメント