GitHub Container Registry(ghcr.io)にDockerイメージをpushする手順


概要

2020年9月1日、GitHub が GitHub Container Registry をパブリック・ベータとして発表 し、同日から利用開始になりました。これは Docker Hub のような公開レジストリ(Dockerイメージを置く場所)の1つであり、GitHub アカウントさえあれば、誰でも利用できるサービスです。

これは ghcr.io 上に Docker イメージを push し、誰でもイメージをダウンロードできるようにするまでの手順をまとめました。

GitHub Container Registry とは?

  • GitHub が提供する、(現時点で)無料で利用可能な、容量無制限の Docker イメージのレジストリ( ghcr.io は、これまでの docker.pkg.github.com とは別)
  • Docker イメージは誰でもダウンロードでき(anonymous pulls) 、公開(public)または非公開(private)も自分で選べる
    • GitHub Package のイメージは削除できないが、ghcr.io に公開した Docker イメージは削除できる
  • 利用するには docker login コマンドで、 ghcr.io に対してログインする。ログイン時の認証は GitHub の Personal Token を使う

以上のことから、 GitHub Container Registry は、 Docker Hub の新しいイメージ保管ポリシー による制限や影響を受けることなく、Docker イメージを第三者に対して公開できる場所であるとも言えるでしょう(現時点では)。

手順

イメージを ghcr.ioに push して公開するには

イメージを GitHub Container Registry (以下 GHCR )に送信するには、予め docker login コマンドで、GHCR に対してログインが必要です。ログインをするためには、GitHub 上の自分の設定ページ上で Personal Access Tokenを作成する必要があります(手順のドキュメント)。

ここでは、仮に ~/ghcr.txt に Personal Access Token の文字列を記録しているとします。

次に、 docker login コマンドで GHCR にアクセスします。以下 <githubユーザ名> は皆さん自身のユーザ名を入力します。

cat ~/ghcr.txt | docker login ghcr.io -u <githubユーザ名> --password-stdin

認証に成功すると、次のようなメッセージが表示されます。

WARNING! Your password will be stored unencrypted in /home/name/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

イメージを送信するには、送信する前にイメージにタグを付ける必要があります。Docker Hub の場合は <ユーザ名>/イメージ名:タグ の形式でしたが、GHCR の場合は ghcr.io/<ユーザ名>/イメージ名:タグ にする必要があります。

たとえば、

  • イメージ ID bf9f52b2d3fa のイメージ

があるとして、これを

  • リポジトリ名を docker-sample-nginx
  • イメージ名を sample-nginx
  • タグを latest

のようにしたい場合は、送信するイメージにタグ ghcr.io/zembutsu/docker-sample-nginx/sample-nginx:latest を付ける必要があります。そのためには docker tag コマンドで、 次のように実行します。

docker tag bf9f52b2d3fa ghcr.io/zembutsu/docker-sample-nginx/sample-nginx:latest

docker images でタグ追加を確認したら、 docker push コマンドで送信するだけです。

$ docker push ghcr.io/zembutsu/docker-sample-nginx/sample-nginx:latest
The push refers to repository [ghcr.io/zembutsu/docker-sample-nginx/sample-nginx]
a49a33440fe7: Pushed
c63ea97607b8: Pushed
6ad8d562c843: Layer already exists
425ee8569962: Layer already exists
5d9ee84be1ec: Layer already exists
6bcd003260b2: Layer already exists
50644c29ef5a: Layer already exists
latest: digest: sha256:d6f2938d0fab3daeb6433c361da460970eb9b8d2796f1679afe6e41bb87b1937 size: 1774

この時点で docker-sample-nginx という名前で private なリポジトリが自動作成され、イメージのパス(イメージ名・タグ)を知っていれば、誰でもダウンロード可能になります。

アップロードしたイメージを確認するには、自分の GitHub プロフィールから Packages のタブをクリックすると、パッケージ情報の中に Private のマークがついた Docker イメージの情報が見えます。

ここで表示されるパッケージ名をクリックし、イメージをダウンロード(pull)する URL の確認や、イメージの公開やイメージ削除ができます。これら状態を変更するには Edit package をクリックします。

View All versions で全てのタグを表示し、タグごとに削除を選べます。

また、 Package settings からは一般公開(Make public)かパッケージ削除(Delete this package)の選択肢が出ます。

ここで Make public を選択すると、自分のプロフィール上でも対象イメージに関するパッケージ情報が表示されます。

Enjoy!

参考情報