Jaybanuan's Blog

どうせまた調べるハメになることをメモしていくブログ

GitHub Container Registry (Preview版) を使ってみる

はじめに

GitHub Container Registryを使ってみたが、Preview版ならではのポイントがいくつかあったので、メモを残しておく。 ここでやりたいことは、GitHub Actionsを利用したCIで、コンテナイメージをビルドして、GitHub Container Registryにプッシュすること。

環境

# cat /etc/os-release | grep PRETTY_NAME
PRETTY_NAME="Ubuntu 20.04.1 LTS"

(1) リポジトリの作成

ひとつリポジトリを作成する。 今回はghcr-workflowという名前でリポジトリを作成した。

(2) Dockerfileの作成

リポジトリのトップディレクトリにDockerfileを作成する。 今回はGitHub Container Registryを使ってみることが目的なので、Dockerfileは以下のようなFROMがあるだけのシンプルなものにした。

FROM hello-world

(3) GitHub Actionsのワークフローの作成

以下の内容でワークフロー.github/workflows/build-and-push.ymlを作成する。 ここでは、実行のトリガを手動(workflow_dispatch)にしている。

name: build and push container image
on:
  workflow_dispatch:

jobs:
  build_and_push:
    name: build and push container image
    runs-on: ubuntu-latest
    steps:
      - name: checkout repository
        uses: actions/checkout@v2

      - name: login
        run: echo "${{ secrets.GHCR_TOKEN }}" | docker login --username "${{ github.repository_owner }}" --password-stdin ghcr.io

      - name: build
        run: docker build --tag "ghcr.io/${{ github.repository_owner }}/greeting:latest" .

      - name: push
        run: docker push "ghcr.io/${{ github.repository_owner }}/greeting:latest"

このワークフローでは、ソースコードをチェックアウトして、レジストリにログインして、コンテナイメージをビルドして、レジストリにプッシュする、という一連の流れを記述している。 レジストリへのログインの時にはGitHubのPersonal Access Tokenを利用する必要があり、ここではsecrets.GHCR_TOKENで指定している。 Personal Access Tokenについては次で説明する。

(4) Personal Access Tokenの作成

GitHub Container Registryの認証にはPersonal Access Tokenが必要なので、ここで作成しておく。 ドキュメントによると、Personal Access Tokenでは「read:packages」と「write:packages」と「delete:packages」の3つのスコープをチェックしておくことになる。

f:id:redj:20201217011740p:plain

そして、このPATをリポジトリのsecretsに登録する。ここではGHCR_TOKENという名前にしている。

f:id:redj:20201217014935p:plain

ちなみに、GitHub Actionsのワークフローの中では、secrets.GITHUB_TOKENという暗黙のPersonal Access Tokenが利用できるのだが、現時点ではこれを利用しての認証はできないようだ。 Docker社のブログには以下のようにある。

Unfortunately what this means is the automatically generated GITHUB_TOKEN will not work for authentication for the initial release. You will have to go to GitHub, generate a personal access token, and create a GitHub Action secret.

言葉を補って訳すと以下になる。

残念なことだが、このことは、GitHub Container Registryの初期リリースにおいて、自動で生成されるGITHUB_TOKENでは認証がうまく機能しないことを意味している。 そのため、GitHubのWebサイトにアクセスし、personal access tokenを生成し、そしてGitHub Actionのsecretを作成しなければならない。

(5) Feature Previewを有効化

GitHub Container Registryは、本ブログの執筆時点ではまだFeature Previewであり、デフォルトでは無効化されている。 そのため、ワークフローの実行前に有効化しておく必要がある。 まずはGitHubのサイトの画面右上のメニューから「Feature Preview」を選択する。

f:id:redj:20201217033900p:plain

そして、「Improved Container Support」のボタン「Enable」をクリックして有効化する。

f:id:redj:20201217033913p:plain

(6) ワークフローの実行

以下の画面のように、作成したワークフローのジョブ「build and push container image」を実行する。

f:id:redj:20201217033939p:plain

ジョブの実行が完了すると、以下の画面のように実行時の標準出力を確認することができる。 ここではdocker pushが成功していることが分かる。

f:id:redj:20201217035745p:plain

(7) コンテナイメージの公開の設定

デフォルトではコンテナイメージは非公開(private)になっているので、公開(public)にしておく。 この手順は、当該コンテナイメージを最初にGitHub Container Registryに登録したときだけ行えばよい。 タブ「Packages」で「Packages settings」を開き、「Make this packages public」でボタン「Make public」をクリックする。

f:id:redj:20201217233127p:plain

コンテナイメージの公開は必須ではないが、以下の2点を気に留めておく必要がある。

  • コンテナイメージの取得(docker pull等)には、コンテナレジストリへのログイン(docker login)が必要になる
  • Feature Previewが終了してGeneral Availableになった際に、非公開のコンテナイメージは課金対象になる可能性がある

(8) 動作確認

docker runを実行して動作確認。

$ docker run ghcr.io/jaybanuan/greeting
Unable to find image 'ghcr.io/jaybanuan/greeting:latest' locally
latest: Pulling from jaybanuan/greeting
Digest: sha256:90659bf80b44ce6be8234e6ff90a1ac34acbeb826903b02cfa0da11c82cbc042
Status: Downloaded newer image for ghcr.io/jaybanuan/greeting:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

上記の通り、Hello from Docker!というメッセージと、その下に解説文が表示されれば、動作確認は成功である。

参考