GitHubのコンテナレジストリにイメージをアップロードする

目次

  1. 背景
  2. GitHubのClassic Tokenを作る
  3. Dockerでログインする
  4. イメージをプッシュする
    1. Dockerfile内でレポジトリを指定する
    2. イメージのビルド & プッシュ
  5. おまけ:Kubernetesからghcrのパッケージを利用する
    1. おまけのおまけ
  6. まとめ
  7. 関連記事

背景

こんにちは。 かりんとうマニア(@karintozuki)です。

開発していると、Dockerイメージをどこかにアップロードしたいときがありますよね。
そんなときはGitHubのコンテナレジストリ(以下、ghcrとします)が便利です。
今日はその使い方を説明します。

GitHubのClassic Tokenを作る

ghcrはTokenでの認証を必要とします。それもClassicのTokenだけが使えるみたいです。
GitHubのアカウント設定から作ってください。

Tokenがクラシックであることと、パッケージの書き込み・読み取り権限を付与することを忘れないでください。

参考:https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry#authenticating-to-the-container-registry

Dockerでログインする

Tokenを生成したらそれを控えて以下のコマンドを実行することで、Dockerにクレデンシャルを登録します。

1
2
3

export CR_PAT=YOUR_TOKEN // {YOUR_TOKEN}を先ほど生成したものに変えてください
echo $CR_PAT | docker login ghcr.io -u USERNAME --password-stdin //USERNAMEをGitHubのユーザ名に変えてください

これであなたのローカルのPCからghcrにイメージをプッシュすることができるはずです。

参考:https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry#authenticating-with-a-personal-access-token-classic

イメージをプッシュする

Dockerfile内でレポジトリを指定する

もしGithub Actionなどでイメージをプッシュするならこの工程は必要ありません。
手動でイメージをプッシュする際はそのイメージがどのレポジトリのイメージなのかを指定する必要があります。

Dockerfile内に以下の行を追加してください。

1
LABEL org.opencontainers.image.source=レポジトリのURL

それではDockerイメージを作ってプッシュしてみましょう。

イメージのビルド & プッシュ

イメージをビルドしていきます。-tオプションを利用してタグを以下のようにつけてください。
タグ名はgchr.io/githubのuser名で始めるようにしてください。イメージの名前とバージョンは自由です。

1
docker build --target production -t ghcr.io/username/image-name:version-name

私の例だと以下のようになります。

1
docker build --target production -t ghcr.io/karintomania/visahack_scrape:0.2

以下のコマンドでイメージをプッシュします。

1
docker push ghcr.io/username/image-name:0.2

そうするとGitHubのレポジトリにパッケージが追加されているはずです。

おまけ:Kubernetesからghcrのパッケージを利用する

最後にアップロードしたパッケージをk8sから使う方法も書いておきます。
以下のコマンドで生成したTokenをghcr-io-credという名前のCredentialとして登録します。名前は別に好きなもので大丈夫です。

1
2
3
4
5
6
7
8
kubectl create secret docker-registry ghcr-io-cred \
--docker-server=[ghcr.io](http://ghcr.io/) \
--docker-username=USERNAME \
--docker-password=TOKEN \
[--docker-email=](mailto:--docker-email=your-email@example.com)EMAIL

// USERNAME, TOKEN, EMAILをそれぞれGitHubのものに変更してください

そしてこのクレデンシャルをYamlファイルでimagePullSecretsとして指定します。

1
2
3
4
5
6
7
spec:
containers:
- name: my-private-container
image: ghcr.io/USERNAME/IMAGE:VERSION
imagePullSecrets:
- name: ghcr-io-cred

おまけのおまけ

私はminikubeを使っているので以下のアドオンを有効にする必要がありました。

1
minikube addons enable registry-creds

まとめ

GitHubにサクッとイメージを上げられるのは嬉しいですね。
DockerHubとかのサービスもありますが、ソースとイメージを一箇所に集めたかったので、GitHubレジストリがあって助かりました。

それじゃ今日はこの辺で。

関連記事

こちらの記事もおすすめです。

Minikubeにリモートのkubectlから接続する