LoginSignup
9
11

More than 1 year has passed since last update.

GitHub Container Registry でパブリックイメージを公開する

Last updated at Posted at 2020-09-06

Docker Hub が無料プランでの制限を強化する1一方、GitHub Container Registry が発表された2
2019年から提供されるようになった GitHub Package Registry3 でも Docker Image は扱えたのだけど、GitHub Container Registry として独立させることで、ユーザ体験とパフォーマンスの向上を目指すとのこと。

GitHub Container Registry(以下 ghcr.io)は2020/09/06時点ではまだ、Public Beta だけど、Github自身が公開しているGithub Action Super-LinterのDocker Imageはすでに ghcr.io のパブリック・イメージとして公開されている。スター5.5k の Github Action のイメージに使用しようとしているのでそれなりに安定稼働が期待できるのかな?4

利用料金については次の様になっている。

  • パブリック・イメージの公開は無料
  • GAまでの間はプライベートイメージも無料
    (GAしたら GitHub Packages の一部として同様のプライスモデルで課金)

パブリック・イメージを公開してみた

Prontoを実行するGithub Actionを作ったで紹介したGithub Action Pronto Actionで利用している Docker Image は元々、Docker Hub でイメージを公開していた。ところが、Pullの回数にも制限がかかるとの発表があったので、パブリックイメージなら無料な ghcr.io に移行してみた。

Docker Hubの場合には、Docker Hubの自動ビルド機能を利用して、masterへのPushやタグをプッシュしたときにイメージをビルドするようにしていた。
ghcr.io で公開するイメージは Github Action でビルドするのが手軽。

公開の手順は次の通り。

  1. ghcr.io アクセス用の Personal Access Token を作る
  2. イメージをビルドする(Dockerfile を含む)リポジトリに Github Workflow を追加する
  3. パッケージをパブリックに設定変更する

一度、仕組みを作ってしまえば、後は自動でビルド、自動で公開してくれる。

ghcr.io アクセス用の Personal Access Token を作る

GHCRが公開された当初はワークフローでデフォルトで利用できる GITHUB_TOKEN では GHCR に Push できなかったが、その後のアップデートでできるようになった。
なので、以下はわざわざ Private Access Token を利用する場合の方法についての記述である。

Pushing and pulling Docker imagesに ghcr.io への読み書きについて基本的なことが書いてある。
それによると、パスワードの代わりに Personal Access Token(以下PAT)を使うと書いてある。
もちろん、パブリック・イメージをPullするだけならログインする必要はないのだけど、Pushしたいので用意する必要がある。
Github Workflow でPushするなら、secrets.GITHUB_TOKENが使えるでは?と思うかもしれないが、ドキュメントにダメって書いてある5

ghcr.io で読み書きするためにはNew personal access tokenにアクセスして、 write:packages を許可したPATを作成する。
下のスクリーンショットでは write:packages 以外も有効にしているが、write:packages を有効にしたら自動的に他も有効になる。セットで必要なようだ。
image.png

作成したPATは、イメージをビルドするリポジトリの Settings > Secrets にアクセスして、後でWorkflow内で参照できるように登録しておく。
このエントリでは GHCR_TOKENというキーで登録したという体で説明する。

イメージをビルドする(Dockerfile を含む)リポジトリに Github Workflow を追加する

Introducing GitHub Container Registryでは、starter-workflows/docker-publish.ymlの利用が紹介されているのだけど、Github ActionのドキュメントPublishing Docker imagesで紹介されているDocker社謹製の Build and push Docker imagesのほうが、ビルドしたイメージのタグをよしなに調整してくれたり便利なのでこちらを使った。

で、Docker Image をビルドして ghcr.io に Push する Workflow は次の通り。

name: Publish Docker image
on:
  push:
    branches:
      - master
      - develop
    tags:
      - '[0-9]+.[0-9]+.[0-9]+'
jobs:
  push_to_registry:
    name: Push Docker image to GitHub Container Registry
    runs-on: ubuntu-latest
    steps:
      - name: Check out the repo
        uses: actions/checkout@v2
      - name: Push to GitHub Container Registry
        uses: docker/build-push-action@v1
        with:
          username: ${{ github.actor }}
          password: ${{ secrets.GHCR_TOKEN }}
          registry: ghcr.io
          repository: heromo/pronto-action
          tag_with_ref: true

masterブランチまたはdevelopブランチにpushした場合、あるいはフィルターパターン'[0-9]+.[0-9]+.[0-9]+'にマッチするGitのタグ(例:1.0.0,1.4.0)をpushした時に実行される。
masterブランチまたはdevelopブランチにpushした場合というのは、これらのブランチにコミットが追加された時というのと同意なので、プルリクエストをマージした場合にも実行される。

registry には ghcr.io を指定する。
password には先程、 Secrets に登録したキーGHCR_TOKENへの参照を設定する。
repository には オーナー名/イメージ名 の形式でPush先を指定する。これはすべて小文字である必要がある(私はGithubのオーナー名に大文字を使っているのでそのまま大文字で設定したらエラーになった)。
tag_with_ref: trueを設定していると、ビルドした Docker Image のタグを次の様によしなに設定してくれる6

  • ブランチmaster -> latest
  • ブランチdevelop -> develop
  • タグ1.4.0 -> 1.4.0

パッケージをパブリックに設定変更する

Pushされたイメージは、リポジトリには紐付いておらず、自分のGithubプロファイルページの Packages を開くと見つけることができる。できたばかりのパッケージはプライベートとなっている。

Configuring visibility of container images for your personal accountに書いてあるとおり、ページの右上の Edit package プルダウンで、Package Setting を選択すると設定ページが開く。
後は、Danger Zone の Make public ボタンをクリックすればパブリックになる。一度、パブリックにするとプライベートには戻せないので注意。

Github Action で利用するイメージであればパブリックにする必要がある。そうしないと、Workflowを実行した時にpullできなくてエラーとなる。

自分のための自分しか使わないイメージならプライベートにしておいても構わないのだけど、GAになったら課金されることに注意が必要。

まとめ

今回、Docker Hub で公開していたイメージを ghcr.io で公開してみた。
Github Actionで利用しているイメージを公開する場合、Github内ですべて閉じるので ghcr.io を使ったほうが手間が少ないと感じた。
パブリックだと無料で、回数制限もなさそうなのもよい。

9
11
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
11