こんにちは。Tomoyuki(@tomoyuki65)です。
Go言語で作ったAPIなどを本番環境にデプロイしたい場合、まずはコンテナ保存用のクラウドサービスに登録する必要がでてくると思います。
例えばGoogle CloudであればArtifact Registry(GAR)がコンテナやパッケージを安全に管理できるGoogleのクラウドサービスです。
この記事では、Go言語(Golang)のAPI用DockerコンテナをGoogle Cloud Artifact Registry(GAR)にデプロイする方法について解説します。
※以下ではGoogle Cloudおよびgcloudコマンドを使います。実際に試したい場合は以下の記事などを参考に、プロジェクトの作成およびgcloudコマンドの準備をして下さい。
関連記事


Go言語(Golang)のAPI用DockerコンテナをGoogle Cloud Artifact Registry(GAR)にデプロイする方法
まずはGo言語(Golang)で簡単なAPIを作成するため、以下のコマンドを実行して各種ファイルを作ります。
$ mkdir infra-sample && cd infra-sample
$ mkdir -p deploy/docker/local && touch deploy/docker/local/Dockerfile
$ mkdir src && touch src/main.go
$ touch compose.yml
次に作成したファイルをそれぞれ以下のように記述します。
・「deploy/docker/local/Dockerfile」
FROM golang:1.25.3-alpine3.22
# タイムゾーンを設定
ENV TZ=Asia/Tokyo
WORKDIR /go/src
COPY ./src .
# go.modがあれば依存関係をインストール
RUN if [ -f ./go.mod ]; then \
      go install; \
    fi
# 開発用のライブラリをインストール
RUN go install github.com/air-verse/air@v1.63.0
RUN go install honnef.co/go/tools/cmd/staticcheck@latest
EXPOSE 8080
・「src/main.go」
package main
import (
    "fmt"
)
func main() {
    fmt.Println("Hello World !!")
}
・「compose.yml」
services:
  go-api:
    container_name: go-api
    build:
      context: .
      dockerfile: ./deploy/docker/local/Dockerfile
    command: air -c .air.toml
    volumes:
      - ./src:/go/src
    ports:
      - "8080:8080"
    tty: true
    stdin_open: true
次に以下のコマンドを実行し、コンテナをビルドします。
$ docker compose build --no-cache
次に以下のコマンドを実行し、各種初期化処理をします。
$ docker compose run --rm go-api go mod init go-api
$ docker compose run --rm go-api air init
次にファイル「src/main.go」を以下のように修正します。
package main
import (
    "log/slog"
    "net/http"
    "github.com/labstack/echo/v4"
)
func main() {
    // echoのルーター設定
    e := echo.New()
    e.GET("/hello", func(c echo.Context) error {
        // レスポンス結果の設定
        res := map[string]string{
            "message": "Hello World !!",
        }
        return c.JSON(http.StatusOK, res)
    })
    e.GET("/test", func(c echo.Context) error {
        // レスポンス結果の設定
        res := map[string]string{
            "message": "Test !!",
        }
        return c.JSON(http.StatusOK, res)
    })
    // ログ出力
    slog.Info("Start go-api !!")
    // サーバー起動
    e.Logger.Fatal(e.Start(":8080"))
}
次に以下のコマンドを実行し、go.modを更新します。
$ docker compose run --rm go-api go mod tidy
次に以下のコマンドを実行し、コンテナの再ビルドおよび起動します。
$ docker compose build --no-cache
$ docker compose up -d
次に以下のコマンドを実行し、ログ出力を確認します。
$ docker compose logs
実行後、以下のように設定したログが出力されて起動すればOKです。

次にPostmanを使ってGo言語で作成したAPIを試してみます。
まずはGETメソッドで「http://localhost:8080/hello」を実行し、以下のように正常終了すればOKです。

次にGETメソッドで「http://localhost:8080/test」を実行し、以下のように正常終了すればOKです。

次に以下のコマンドを実行し、コンテナを削除しておきます。
$ docker compose down
本番環境のGAR用のDockerコンテナの作成とテスト
次に本番環境であるGoogle Cloud Artifact Registry(GAR)にデプロイするためのDockerコンテナを作るため、以下のコマンドを実行してDockerfileを作成します。
$ mkdir -p deploy/docker/prod && touch deploy/docker/prod/Dockerfile
次に作成したDockerfileを以下のように記述します。
・「deploy/docker/prod/Dockerfile」
####################
# ビルドステージ
####################
FROM golang:1.25.3-alpine3.22 AS builder
WORKDIR /go/src
COPY ./src .
# 依存関係をインストール
RUN go install
# ビルド(GOOS:OS指定、GOARCH:CPUアーキテクチャ指定)
RUN GOOS=linux GOARCH=amd64 go build -o main .
####################
# 実行ステージ
####################
FROM alpine:3.22 AS runner
# タイムゾーンを設定
ENV TZ=Asia/Tokyo
# インストール可能なパッケージ一覧の更新
RUN apk update && \
    apk upgrade && \
    # パッケージのインストール(--no-cacheでキャッシュ削除)
    apk add --no-cache \
            tzdata
WORKDIR /app
# コンテナ用ユーザー作成
RUN addgroup --system --gid 1001 appuser && \
    adduser --system --uid 1001 appuser
# ビルドステージで作成したバイナリをコピー
COPY --from=builder --chown=appuser:appuser ./go/src/main .
# ポートを設定
EXPOSE 8080
# コンテナ起動ユーザー設定
USER appuser
# APIサーバー起動コマンド
CMD ["./main"]※Cloud Run用のコンテナを作る場合は、Goのビルド時に「GOOS=linux GOARCH=amd64」が必要です。
次に以下のコマンドを実行し、コンテナをビルドおよび起動します。
$ docker build --no-cache -f ./deploy/docker/prod/Dockerfile -t go-api:1.0.0 .
$ docker run -d -p 80:8080 go-api:1.0.0※コンテナをビルドする際は本番環境用を想定し、タグにバージョン「1.0.0」を含めるようにしています。
次にDocker Desktopからコンテナが起動していることを確認し、コンテナ名をクリックします。

コンテナのログを確認し、以下のように設定したログが出力されていればOKです。

次にPostmanを使ってAPIを試してみます。
まずはGETメソッドで「http://localhost/hello」を実行し、以下のように正常終了すればOKです。

次にGETメソッドで「http://localhost/test」を実行し、以下のように正常終了すればOKです。

次にDocker Desktopから対象のコンテナを削除しておきます。
コンテナ一覧画面に戻り、対象のコンテナの右側にある「ゴミ箱ボタン」をクリックします。

次にポップアップが表示されるので、「Delete forever」をクリックして削除します。

Google CloudのArtifact Registry(GAR)にリポジトリを作成する
次にGoogle CloudのArtifact Registry(GAR)にDockerコンテナをデプロイするためのリポジトリを作成します。
Google Cloudで対象のプロジェクト画面を開いた後、画面上の検索バーからサービス「Artifact Registry」を検索してクリックして下さい。

次に画面上の「+ リポジトリの作成」をクリックします。

これでリポジトリ作成画面が表示されます。

次に名前に「go-api」を入力します。

※形式とモードはデフォルトでOK
次にロケーションタイプは、リージョンに「us-central1(アイオワ)」を選択、説明に「テスト用」を入力後、「+ ラベルを追加」をクリックします。

※リージョンはCloud Strageの無料枠の対象になる「us-central1(アイオワ)」と合わせる形で選択しています。
次にラベルのキーに「env」、値に「dev」を設定します。

※ラベル設定は必須ではありませんが、実務を想定して設定を試します。
次にクリーンアップポリシーの設定では「アーティファクトを削除」を選択し、「クリーンアップポリシーを追加」をクリックします。

※クリーンアップポリシーの設定も必須ではありませんが、実務ではなんらかの設定をすることを想定して試します。
次にクリーンアップポリシーの作成画面が開きますが、様々な設定が可能になってます。

今回は名前に「最新3個まで残す」、ポリシータイプに「最新バージョンを保持」を選択、保持数に「3」を入力後、「完了」をクリックします。

次にArtifact Analysisの脆弱性スキャンがデフォルトで有効になっていますが、これは別途料金が発生すると思われるので、「無効」を選択しておきます。
そして全ての設定完了後、「作成」をクリックします。

これでDockerコンテナを保存するためのリポジトリの作成が完了です。
リポジトリのパスは後で使うため、画面右上の「パスをコピー」をクリックしてコピーし、メモしておきましょう。

※パスは「us-central1-docker.pkg.dev/<プロジェクトID>/go-api」のようなものが取得できます。
gcloudコマンドでArtifact Registryに対するリクエストの認証設定
次にGoogle Cloud CLIのgcloudコマンドを使い、Artifact Registryに対するリクエスの認証設定を行います。
今回はリージョンに「us-central1(アイオワ)」を指定したため、以下のコマンドを実行します。
$ gcloud auth configure-docker us-central1-docker.pkg.dev※他のリージョンを使っている場合はリージョンごとに設定が必要です。
コマンド実行後、Do you want to continue (Y/n)?と聞かれるので、「y」を入力してEnterを押します。
実行後、「Docker configuration file updated.」が表示されればOKです。
これでdockerコマンドからArtifact Registryに対してコンテナをプッシュできるようになります。

DockerコマンドでArtifact Registryの対象のリポジトリにコンテナをプッシュ
次に上記で事前にビルドして作成したコンテナ「go-api:1.0.0」を使い、以下のコマンドを実行してArtifact Registryにプッシュできるように新しくタグ付けします。
$ docker tag go-api:1.0.0 us-central1-docker.pkg.dev/<プロジェクトID>/go-api/go-api:1.0.0※<プロジェクトID>は各自の環境に合わせて修正して下さい。
次に以下のコマンドを実行し、Artifact Registryの対象のリポジトリにコンテナをプッシュします。
$ docker push us-central1-docker.pkg.dev/<プロジェクトID>/go-api/go-api:1.0.0※<プロジェクトID>は各自の環境に合わせて修正して下さい。
コマンド実行後、ターミナルでは以下のようになります。

次にGoogle CloudのArtifact Registryの対象のリポジトリ画面に戻り、画面右上の「更新」をクリックします。

これでプッシュしたコンテナが表示されればOKです。次にコンテナ名をクリックしてみます。

以下のようにコンテナの情報が表示されればOKです。
ここまでできれば、あとはCloud Runなどを利用してコンテナのデプロイが可能です。

最後に
今回はGo言語(Golang)のAPI用DockerコンテナをGoogle Cloud Artifact Registry(GAR)にデプロイする方法について解説しました。
本番環境用のインフラにGoogle Cloudを使う場合は、Artifact Registryを使うことになると思うので、ぜひ参考にしてみて下さい。

 
  
  
  
  

コメント