GitHub Action で GHCR へのコンテナー イメージの Push が成功しない (permission_denied: write_package)

GitHub Actions のワークフローでエラーが発生し、正常終了しなくなってしまいました。

ワークフローでは、コンテナー イメージのビルドと、GitHub Container Registry (ghcr.io / GHCR) へイメージの Push をしています。 このイメージ Push の処理で、権限関連と思われるエラー (Error: buildx failed with: ERROR: denied: permission_denied: write_package) が発生しました。

本記事に対処方法をまとめておきます。


ワークフローと発生事象

ワークフローの YAML ファイルは次の内容になっています。 新しいタグ/リリースを作成するとワークフローが実行され、コンテナー イメージのビルドと、イメージの GHCR への Push が行われます。

# {repository}/.github/workflows/release.yml
name: release

on:
  release:
    types:
      - published

env:
  DOCKER_BASE_NAME: ghcr.io/${{ github.repository }}

jobs:
  build-and-push:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write

    steps:
      - uses: actions/checkout@v2

      - name: Login to GitHub Container Registry
        uses: docker/login-action@v2
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Build and push
        uses: docker/build-push-action@v3
        with:
          context: .
          push: true
          tags: |
            ${{ env.DOCKER_BASE_NAME }}:${{ github.event.release.tag_name }}
            ${{ env.DOCKER_BASE_NAME }}:latest            

Build and push ステップのログを確認すると、次のエラーが出力されていました。 permission_denied: write_package のメッセージが出力されており、成果物 (コンテナー イメージ) の書き込みの権限に問題があるようです。

  ...
#16 pushing ghcr.io/{repository}/{image name}:v0.0.10 with docker
#16 pushing layer 39ce749c6133
  ...
#16 pushing layer 9eb82f04c782 0.6s done
#16 ERROR: denied: permission_denied: write_package
------
 > pushing ghcr.io/{repository}/{image name}:v0.0.10 with docker:
------
ERROR: denied: permission_denied: write_package
Error: buildx failed with: ERROR: denied: permission_denied: write_package
  ...

GHCR に Push するコンテナー イメージは、GitHub では パッケージ として扱われます。 上記 YAML のワークフローでは、ワークフロー実行時に生成される GITHUB_TOKEN シークレット の資格情報をパッケージへのアクセスに使用しています。 GITHUB_TOKEN を使用してパッケージにアクセスするためには、パッケージ側の設定において「どのリポジトリからのアクセスを許可するか」を設定する必要があります。

対処方法

リポジトリとパッケージ (コンテナー イメージ) が存在する Organization のページを開きます。 ページ上部にあるタブの [Packages] を開き、対象となるパッケージのページへと進みます。

パッケージのページの右下にある [Package settings] へと進みます。 このリンクを見つけることができずに苦労しました。。。 画面上部のタブにある [Settings] (リポジトリの設定) とは異なるので注意です。

[Manage Actions access] に、ワークフローを実行するリポジトリ (ソースコードやワークフローのファイルが存在するリポジトリ) を追加します。 ロールは [Write] を割り当てます。

ロールの割り当てが完了したら、ワークフローを再実行します。 Build and push ステップのログを確認すると、エラーが解消しており、GHCR へのコンテナー イメージの Push が成功しました。

  ...
#16 pushing ghcr.io/{repository}/{image name}:v0.0.10 with docker
#16 pushing layer 466d29bb1cc1
  ...
#16 pushing layer 9eb82f04c782 14.3s done
#16 DONE 13.9s
  ...

なぜこの問題が発生した?

もともとこのリポジトリのワークフローでは、personal access token を使ってレジストリにアクセスをしていました。

$ echo $CR_PAT | docker login ghcr.io -u USERNAME --password-stdin
> Login Succeeded

GitHub Packages / Container registry - コンテナレジストリの利用

その後、コンテナー レジストリのログインに docker/login-action を使用するようにワークフローを変更しました。 GITHUB_TOKEN の資格情報を利用するようになったものの、パッケージ側ではリポジトリの許可をしていなかったために、権限エラーが発生しました。


Previous Post

comments powered by Disqus