📝
Dockerfileを用いたGoアプリケーションの本番環境構築
はじめに
本記事では、Dockerfileを活用してGo言語で書かれたAPIを安全かつ効率的に本番環境へデプロイする方法を紹介します。
1. Dockerfileの構成概要
Dockerfileは以下のようなマルチステージビルドを採用しています。
- ビルドステージ: Goの公式軽量イメージ(alpine)を使用し、依存関係の解決とバイナリのビルドを行います。
- デプロイステージ: 最小限のイメージ(distroless)を利用してセキュアな実行環境を構築します。
2. Dockerfileの詳細解説
ビルドステージ
FROM golang:1.22.4-alpine AS builder
WORKDIR /go/src/api
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o /usr/local/bin/main ./cmd/app/api
-
golang:1.22.4-alpine
: 軽量なAlpineベースのGoイメージを利用し、ビルド時間を短縮。 -
go mod download
: 依存パッケージをあらかじめダウンロードし、キャッシュを効果的に利用。 -
CGO_ENABLED=0
: C言語への依存を除外し、バイナリをスタティックにビルドすることで依存関係を最小限にします。
デプロイステージ
FROM gcr.io/distroless/base:nonroot AS deploy
WORKDIR /
COPY /usr/local/bin/main /usr/local/bin/main
EXPOSE 8080
USER nonroot:nonroot
ENTRYPOINT [ "/usr/local/bin/main" ]
-
gcr.io/distroless/base:nonroot
: Googleが提供するdistrolessイメージを使用。シェルやパッケージマネージャを含まず、攻撃対象を最小化。 -
USER nonroot:nonroot
: 非rootユーザーで実行することで、セキュリティを高めています。
3. ビルドとデプロイの手順
以下のコマンドを使用してDockerイメージをビルドします。
docker build -t your-app-name:latest .
ビルドされたイメージをコンテナとして起動します。
docker run -d -p 8080:8080 --name your-app-container your-app-name:latest
4. 本番環境での運用ポイント
- 軽量・安全なイメージ: distrolessイメージを利用することで、本番環境のセキュリティを向上できます。
- 非rootユーザーの実行: 本番運用において必須のベストプラクティスです。
- シンプルな管理: マルチステージビルドによりイメージサイズが最適化され、デプロイ速度が向上します。
Dockerfileを適切に構築・活用することで、安全かつスケーラブルな本番環境を迅速に構築することが可能です。ぜひ参考にしてみてください。
Discussion