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

# 概要

2020年9月1日、GitHub が [GitHub Container Registry をパブリック・ベータとして発表](https://github.blog/2020-09-01-introducing-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 の新しいイメージ保管ポリシー](https://qiita.com/zembutsu/items/e92a2e2f46b147e5a206) による制限や影響を受けることなく、Docker イメージを第三者に対して公開できる場所であるとも言えるでしょう（現時点では）。

# 手順

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

イメージを GitHub Container Registry （以下 GHCR ）に送信するには、予め `docker login` コマンドで、GHCR に対してログインが必要です。ログインをするためには、GitHub 上の自分の設定ページ上で Personal Access Tokenを作成する必要があります（[手順のドキュメント](https://docs.github.com/ja/github/authenticating-to-github/creating-a-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 イメージの情報が見えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13002/cf57c7f8-ec49-c9b4-7a51-ff515945dac4.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13002/e28c91fc-8356-0afc-c37d-624e9f5e12cc.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13002/bdbb8a74-a99f-62d5-c68e-725aa1f6895e.png)


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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13002/00ebc819-e861-d7b0-0252-8d677cb9a8a4.png)

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



Enjoy!

# 参考情報

- Introducing GitHub Container Registry - The GitHub Blog
  - https://github.blog/2020-09-01-introducing-github-container-registry/
- Migrating to GitHub Container Registry for Docker images - GitHub Docs
    - https://docs.github.com/en/packages/getting-started-with-github-container-registry/migrating-to-github-container-registry-for-docker-images
- Docker Support for the New GitHub Container Registry - Docker Blog
  - https://www.docker.com/blog/docker-support-for-the-new-github-container-registry/