y-ohgi's blog

TODO: ここになにかかく

GitHub PackagesでDockerイメージを管理する

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

  1. write:packages
  2. read:packages
  3. 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の可視制は異なるライフサイクルとなることに注意してください。

ref: https://docs.github.com/ja/enterprise-server@3.17/packages/learn-github-packages/configuring-a-packages-access-control-and-visibility

料金

現時点では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分

ref: https://docs.github.com/ja/packages/working-with-a-github-packages-registry/working-with-the-container-registry#troubleshooting