GitHub Container Registry (ghcr.io) は、GitHub が提供するコンテナイメージのレジストリです。 Public Packages であれば無料で利用でき、GitHub Actions と組み合わせることでデータ転送料金も無料になります。
ghcr.io は2通りの使い方があります。
- ローカルから Docker CLI を使ってイメージをビルドしてプッシュする方法
- GitHub Actions を使ってコードの変更に合わせて自動でイメージをビルドしてプッシュする方法
今回はGitHub Actions を使って自動でイメージをビルドしてプッシュする方法を紹介します。
GitHub Actions から自動でプッシュする
GitHub Actions を使えば、コードをプッシュするだけで自動的にイメージのビルドとプッシュができます。以下はワークフローの例です。
name: Docker Build and Push
on:
push:
branches:
- main
# GHCR へのプッシュには packages: write が必要
permissions:
contents: read
packages: write
jobs:
build-and-push:
runs-on: ubuntu-latest
steps:
# ソースコードをチェックアウト
- name: Check out code
uses: actions/checkout@v4
# ghcr.io にログイン
- name: Log in to GitHub Container Registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
# デフォルトの GITHUB_TOKEN を利用
password: ${{ secrets.GITHUB_TOKEN }}
# Docker イメージをビルドしてプッシュ
- name: Build and push Docker image
uses: docker/build-push-action@v6
with:
context: .
push: true
tags: ghcr.io/${{ github.repository }}:latest
トラブルシューティング
GitHub Actions から ghcr.io にプッシュする際に、以下のようなエラーが出ました。
#16 ERROR: denied: permission_denied: write_package
------
> pushing ghcr.io/kkato/test-app:latest with docker:
------
ERROR: failed to build: denied: permission_denied: write_package
ghcr.io 上のパッケージに対して、そのリポジトリの Actions がアクセスできるよう許可されていないことが原因でした。
まず GitHub プロフィールの「Packages」タブから対象のパッケージを探します。

パッケージのページに移動し、右側の「Package settings」をクリックします。

「Manage Actions access」セクションで「Add Repository」からリポジトリを追加し、Role を「Admin」に設定します。

再度 Actions を実行すれば、エラーが解消されました。