TL;DR
- GitHubのレジストリ機能GitHub Packagesを用いてDockerイメージを管理する
- GitHub Packagesはユーザー/Orgに紐づき、リポジトリとは別のライフサイクルになる点に注意が必要
About
GitHub PackagesではDocker(OCIイメージ)・Ruby Gem・npmなどを管理するレジストリ機能がある。
それを利用してDockerイメージを管理することが今回の目的。
Docker Hubや各種クラウドベンダーの場合レジストリの作成・課金体系・Auth・ライフサイクルの管理などが煩雑になったり、実際のコード開発者が手をあげることや推進することが必要になり遠くなることが多くなってしまう。
また、自前でコンテナレジストリ(Harbor等)を用意する場合構築・運用コストが非常に高くなってしまう。
GitHub Packagesであれば日頃から利用しているGitHubの延長で使用しやすい。
How To
Personal Access Token(Classic)の取得
GitHub Packagesでは現在PATでの認証のみがサポートされています。
そのためPATの作成を行う必要があります。
以下のURLから3つ(+自動で選択される repo 権限)を取得してください。
https://github.com/settings/tokens/new
- write:packages
- read:packages
- delete:packages
蛇足ですが、CI/CDでは repo の権限は強力すぎるため、GitHubの公式からは非推奨となっています。
コンテナレジストリの利用 - GitHub ドキュメント
PATを環境変数に登録
$ export CR_PAT=ghp_xxxxxxxxxxxx
GitHub Packagesへ登録
echoを行うだけのイメージを作成します。
FROM alpine:3 CMD ["echo", "Hello"]
build時に同時にタグをつけます。
$ docker build -t ghcr.io/${NAMESPACE}/${NEW_IMAGE_NAME} .
- ghcr.io
ghcr.ioがGitHub Packagesのドメインいなります。
- NAMESPACE
- NAMESPACEは個人アカウントもしくはOrganizationの名前にします。
- NEW_IMAGE_NAME
- 任意の命名を行います。
- NEW_IMAGE_NAMEはリポジトリと1対1の関係にはなりません、イメージはNAMESPACE配下に紐づきます。
$ echo $CR_PAT | docker login ghcr.io -u USERNAME --password-stdin
$ docker push ghcr.io/${NAMESPACE}/${NEW_IMAGE_NAME}
pushが完了すると以下のようにプロフィールの"Packages"タブにpushしたイメージが表示されます。

備考
GitHub Packagesの可視制
- GitHub Packagesにpushした場合、デフォルトの設定はPrivateになっているため他のユーザーからはアクセスできません。
- リポジトリが非公開であってもPackagesの可視制は異なるライフサイクルとなることに注意してください。
料金
現時点ではContainer Registryは各プラン毎に無料枠があります。
- Freeプラン(月)
- 500MBのストレージ
- データ転送量1GB
- Proプラン(月)
- 2GBのストレージ
- データ転送量10GB
ref: https://docs.github.com/en/enterprise-cloud@latest/billing/concepts/product-billing/github-packages
Container Registryの制限
- レイヤー毎に10GBのサイズ制限
- アップロードタイムアウト制限が10分