🐳

Github Container RegistryにマルチアーキテクチャイメージをPushして運用してみる

に公開

この記事は Social Databank Advent Calendar 2025 の 17 日目の記事です。

はじめに

皆さんは Github Container Registry というものをご存知でしょうか?
Github Container Registry (以降、GHCR) は、GitHub が提供するコンテナイメージのホスティングサービスで、Docker イメージや OCI イメージを簡単に管理・配布できるプラットフォームです。
かなりざっくりに言ってしまえば、皆さんお馴染みの Docker Hub の Github 版のようなものです。

逸般の誤家庭な我が家には不定期に構築され直すオンプレミス Kubernetes(以降、k8s)クラスタが存在しています。
この k8s クラスタでは主に公式イメージあるいは Bitnami のような信頼できるベンダーが作成しているイメージを使用しています。
公式イメージがない場合や信頼できるベンダーがイメージを作成していない場合は自分で作成し、Amazon Elastic Container Registry (以降、ECR)のプライベートリポジトリに push し、このイメージを使用していました。

しかし、k8s クラスタを構築する度に ECR でのイメージの pull に必要な認証情報を設定しないといけないことが面倒臭く感じていたこと、Raspberry Pi を k8s の worker ノードとして新たにクラスタに参加させることをきっかけに、GHCR に乗り換えてマルチアーキテクチャイメージでの運用することにしました。

やること

1. Github の Personal access token(classic)の取得

GHCR に対する操作(Push 等)で使用する認証情報は Fine-grained tokens ではなく Tokens (classic) と書かれた方の token を利用します。
そのため、以下の権限が付与されている Token が無い場合は、新規作成しましょう。なお、画面遷移してしまうと Token の値を確認できなくなるので、作成後は必ず Token の値を控えておきましょう。

  • read:packages
  • write:packages
  • delete:packages

2. GHCR にログイン

docker loginコマンドを使用して GHCR にログインします。

bash
export CR_PAT=<取得したtoken>
echo $CR_PAT | docker login ghcr.io -u <Githubのユーザー名> --password-stdin

Login Succeeded と表示されたら無事 GHCR にログインできています。

3. イメージをビルド

今回は x86_64 向けイメージ(linux/amd64)と arm64 向けイメージ(linux/arm64)をビルドします。

bash
docker build --platform linux/amd64,linux/arm64 -t ghcr.io/<Githubのユーザー名>/<イメージ名>:latest .

イメージビルド時の引数に--platform linux/amd64,linux/arm64を渡してあげることで、x86_64 向けイメージと arm64 イメージをビルドできます。

docker buildx imagetools inspect <タグ名>を実行して、以下のように MediaType がapplication/vnd.oci.image.manifest.v1+jsonになっている項目の Platform が linux/amd64 と linux/arm64 になっていれば、マルチアーキテクチャビルドでビルドできています。

bash
$ docker buildx imagetools inspect ghcr.io/<ユーザー名>/<イメージ名>:latest
Name:      ghcr.io/<ユーザー名>/<イメージ名>:latest
MediaType: application/vnd.oci.image.index.v1+json
Digest:    sha256:cb5a78a87b133821b4c149e37d99f16dacea9683de69e6adf87c3af80cb90824

Manifests:
  Name:        ghcr.io/<ユーザー名>/<イメージ名>:latest@sha256:a71a37e4f40edc7aa54f394ec70253ae5d83c141740102b9db482a117efca203
  MediaType:   application/vnd.oci.image.manifest.v1+json
  Platform:    linux/amd64

  Name:        ghcr.io/<ユーザー名>/<イメージ名>:latest@sha256:5bd05c36277797f88251dc2270c5f5808ddaa9884d554e509e951736449ecb92
  MediaType:   application/vnd.oci.image.manifest.v1+json
  Platform:    linux/arm64

  ...

4. イメージを Push

イメージの Push に関しては、通常のイメージを Push する際と同じく、docker pushコマンドで行えば問題ありません。

bash
docker push ghcr.io/<Githubのユーザー名>/<イメージ名>:latest

5. パッケージの可視性の変更

初期状態では、パッケージの可視性が private になっているため、イメージを pull してくる際に認証情報が必要になります。今回はパッケージの可視性を public に変更することで、認証情報無しでも Pull できるように変更します。

  1. 自分のプロフィールページ(https://github.com/<Github のユーザー名>)にアクセス
  2. ヘッダーメニューの Packages をクリック
  3. 対象のパッケージをクリック
  4. 右側のメニューにある Package settings をクリック
  5. Danger Zone 内にある Package visibility の項目の Change visibility ボタンを押す
  6. Public のラジオボタンを選択し、テキストボックスにパッケージ名を入力し、「I understand the consequences, change package visibility」と書かれたボタンを押す

上記を実行することで、イメージを Pull してくる際に認証情報が不要になります。
この後はいつも通りdocker pullコマンドやマニフェストの image に指定してkubectl applyを実行したら、作成したイメージを使用できます。

最後に

明日の担当は @shun0907 さんです!

ソーシャルデータバンク テックブログ

Discussion