Publish Docker Image to GitHub Package Registry

5 月に発表されたGitHub Package Registryの limited public beta が通ったのでひとまず Docker イメージを push してみた。

How to Use

Docker イメージを push するための設定方法はこちら。
Configuring Docker for use with GitHub Package Registry

今回はこの GitHub リポジトリに Docker イメージを push した。
https://github.com/mazgi/docker.hugo-static-website

docker login

docker login の前に、

Note: If you have two-factor authentication enabled, you must use a personal access token instead of a password.

とのことなので 2FA を有効にしている場合は https://github.com/settings/tokens から新しい token を払い出す。
scope は ⏬ の 2 つで問題なかった。

  • write:packages
  • read:packages

Password の代わりに発行した token を入力すると docker login が成功する。

$ docker login docker.pkg.github.com
Username: mazgi
Password:
Login Succeeded

なお 2FA が有効なままパスワードログインを試みると 401 Unauthorized となる。

$ docker login docker.pkg.github.com
Username: mazgi
Password:
Error response from daemon: login attempt to https://docker.pkg.github.com/v2/ failed with status: 401 Unauthorized

docker push

すでにビルド済みイメージが手元にあったのでこれを push する。

$ docker images mazgi/hugo-static-website
REPOSITORY                  TAG                   IMAGE ID            CREATED             SIZE
mazgi/hugo-static-website   hugo-0.55-2019.06.0   6cf1f0bee40d        6 days ago          491MB
mazgi/hugo-static-website   hugo-0.54-2019.03.0   c8aee4d02e97        3 months ago        582MB
mazgi/hugo-static-website   latest                7d61810b735c        7 months ago        565MB
mazgi/hugo-static-website   hugo-0.52-2018.11.1   e8c33769e237        7 months ago        565MB

まずイメージ ID に対して
docker.pkg.github.com/OWNER/REPOSITORY/IMAGE_NAME:VERSION
の命名で tag をつける。

$ docker tag 7d61810b735c docker.pkg.github.com/mazgi/docker.hugo-static-website/hugo-static-website:latest

そして docker push

$ docker push docker.pkg.github.com/mazgi/docker.hugo-static-website/hugo-static-website:latest
The push refers to repository [docker.pkg.github.com/mazgi/docker.hugo-static-website/hugo-static-website]
dfd97f0db723: Pushed
8d7ea83e3c62: Pushed
6a061ee02432: Pushed
f73b2816c52a: Pushed
6267b420796f: Pushed
a30b835850bf: Pushed
latest: digest: sha256:535f38767049a4991cc0d659771c4114a1795c86a3f29c3784df16620e381dfa size: 1570

push すると https://github.com/mazgi/docker.hugo-static-website/packages にイメージが表示される。

description も書ける模様。

リリースページでは git の tag などと混ざって表示される。
なるほど、今まで “Releases” と “Tags” の違いがいまいち薄いと思っていたがこういうことが計画されていたのだろうか。

docker pull

pull も特別な操作はなく行える。

$ docker pull docker.pkg.github.com/mazgi/docker.hugo-static-website/hugo-static-website:latest
latest: Pulling from mazgi/docker.hugo-static-website/hugo-static-website
Digest: sha256:535f38767049a4991cc0d659771c4114a1795c86a3f29c3784df16620e381dfa
Status: Image is up to date for docker.pkg.github.com/mazgi/docker.hugo-static-website/hugo-static-website:latest

That’s all

以下の点が特に便利だと感じた。

token で docker login するだけで docker push できる

例えば IaaS の CLI などをインストールしなくても push/pull できる。

認証/認可が GitHub Repository と共通

例えばチームメンバーが変更されたとき、あるいは CI/CD のステップとして pull/push するとき、GitHub の認証/認可だけ考慮すれば済む。

複数のイメージ名を 1 つの Registry に登録できる

例えば Web フロントエンド, BFF, etc.などをそれぞれ違うイメージとして 1 つの GitHub repository に紐付けて管理できる。

GitHub Actionsと組み合わせることで Write Code -> Build Container -> Deploy Container を GitHub.com 上で行えるようになった。
次は Docker ホスティングサービスが出てきたら面白い