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
Next Post