フラミナル

考え方や調べたことを書き殴ります。IT技術系記事多め

【新規ツール探し】GitHubのコンテナレジストリ「ghcr」を触ってみる

github 章魚貼紙

  • 記事作成日:2022/12/10

情報

名前 URL
Github -
公式サイト https://docs.github.com/ja/packages/learn-github-packages/introduction-to-github-packages
デモサイト
開発母体 GitHub
version -
言語 -
価格 https://docs.github.com/ja/billing/managing-billing-for-github-packages/about-billing-for-github-packages
ライセンス | Apache-2.0 license MIT

何ができるもの?

  • GitHub へのコンテナイメージの保存(コンテナ以外の artifact も push 可能)
    • Container registry
    • Docker registry
    • RubyGems registry
    • npm registry
    • Apache Maven registry
    • Gradle registry
    • NuGet registry
  • 保存先はアカウントに紐づける or リポジトリに紐づける の2パターンがある

利用シーン

  • artifact を保存しておきたい時
  • CI/CDを GitHub で完結したい時

登場背景

by DeepL

GitHub Packagesは、コンテナなどの依存関係を含むパッケージのホスティングと管理を行うためのプラットフォームです。GitHub Packagesは、ソースコードとパッケージを一箇所にまとめ、統合的な権限管理と課金を提供するため、ソフトウェア開発をGitHub上で一元管理することができます。

GitHub PackagesをGitHub API、GitHub Actions、webhooksと統合することで、コード、CI、デプロイメントソリューションを含むエンドツーエンドのDevOpsワークフローを構築することが可能です。

所感

  • 既存のクレデンシャルと docker コマンドで使えるので非常に楽だった。
  • GitHub にコードもあって、コンテナイメージもあると GitHub ダウン時にとても困りそうなので、サービス規模によってはイメージの格納先を分散した方がよさそう。

使い方

今回使ったコード - framinal-new-tools/ghcr at main · lirlia/framinal-new-tools

準備

Personal Access Token(Classic) を発行する

❯ export CR_PAT=ghp_XXXXX

# ログイン
❯ echo $CR_PAT | docker login ghcr.io -u lirlia --password-stdin
Login Succeeded

自分のアカウントに push する

❯ export KO_DOCKER_REPO=ghcr.io/lirlia

❯ ko publish ./
2022/12/10 09:51:39 Using base distroless.dev/static:latest@sha256:f0c505e3a47c5c7593316de0efa5ae21a491198678c2f630dbefae28c78f7d8f for github.com/test
2022/12/10 09:51:40 Building github.com/test for linux/amd64
2022/12/10 09:51:41 Publishing ghcr.io/lirlia/test-b1e961c37ef3cc8dcc1a152c78ed9434:latest
2022/12/10 09:51:43 pushed blob: sha256:3c1c293f9e54ec10151f5a05e127fae7f476a23cd4f088d3f1afa3e5a09d9ccd
2022/12/10 09:51:43 pushed blob: sha256:13b2c7c817cbd54d8cd3324259378af66ecd78772cee5a166187db0ff82fd476
2022/12/10 09:51:44 ghcr.io/lirlia/test-b1e961c37ef3cc8dcc1a152c78ed9434:sha256-31a7a38e14b10b84f64addcb57155bab94816a0d156293517e4f1005980127e2.sbom: digest: sha256:94548620e4914b7b6cdc631981524b9d67877d025bf74cfabb9d3b4473085e5c size: 368
2022/12/10 09:51:44 Published SBOM ghcr.io/lirlia/test-b1e961c37ef3cc8dcc1a152c78ed9434:sha256-31a7a38e14b10b84f64addcb57155bab94816a0d156293517e4f1005980127e2.sbom
2022/12/10 09:51:46 pushed blob: sha256:250c06f7c38e52dc77e5c7586c3e40280dc7ff9bb9007c396e06d96736cf8542
2022/12/10 09:51:46 pushed blob: sha256:ed22837caa4b0b93ed40823b0ac5ac80405299197eb0dca05020cec83f1d3dbe
2022/12/10 09:51:47 pushed blob: sha256:a2ef785fb680e30f81a20316e8944163dbd33669497aff1483c99c09617fcd82
2022/12/10 09:51:48 pushed blob: sha256:de95530883a38c1ef89a9360f87250545270b714eeb712c4292f6290289adf17
2022/12/10 09:51:48 ghcr.io/lirlia/test-b1e961c37ef3cc8dcc1a152c78ed9434:latest: digest: sha256:31a7a38e14b10b84f64addcb57155bab94816a0d156293517e4f1005980127e2 size: 1072
2022/12/10 09:51:48 Published ghcr.io/lirlia/test-b1e961c37ef3cc8dcc1a152c78ed9434@sha256:31a7a38e14b10b84f64addcb57155bab94816a0d156293517e4f1005980127e2
ghcr.io/lirlia/test-b1e961c37ef3cc8dcc1a152c78ed9434@sha256:31a7a38e14b10b84f64addcb57155bab94816a0d156293517e4f1005980127e2

こうなってる

pull の確認

❯ docker pull ghcr.io/lirlia/test-b1e961c37ef3cc8dcc1a152c78ed9434
Using default tag: latest
latest: Pulling from lirlia/test-b1e961c37ef3cc8dcc1a152c78ed9434
de95530883a3: Pull complete 
250c06f7c38e: Pull complete 
a2ef785fb680: Pull complete 
Digest: sha256:31a7a38e14b10b84f64addcb57155bab94816a0d156293517e4f1005980127e2
Status: Downloaded newer image for ghcr.io/lirlia/test-b1e961c37ef3cc8dcc1a152c78ed9434:latest
ghcr.io/lirlia/test-b1e961c37ef3cc8dcc1a152c78ed9434:latest

GitHub リポジトリに push する

❯ ko build --local --image-label org.opencontainers.image.source=https://github.com/lirlia/framinal-new-tools
2022/12/10 10:25:17 Using base distroless.dev/static:latest@sha256:f0c505e3a47c5c7593316de0efa5ae21a491198678c2f630dbefae28c78f7d8f for github.com/test
2022/12/10 10:25:18 Building github.com/test for linux/amd64
2022/12/10 10:25:19 Loading ko.local/test-b1e961c37ef3cc8dcc1a152c78ed9434:2f81d3a8878e2bc0cdb267e598e23f746014ad24e7c1dba335fe476368d129f3
2022/12/10 10:25:19 Loaded ko.local/test-b1e961c37ef3cc8dcc1a152c78ed9434:2f81d3a8878e2bc0cdb267e598e23f746014ad24e7c1dba335fe476368d129f3
2022/12/10 10:25:19 Adding tag latest
2022/12/10 10:25:19 Added tag latest
ko.local/test-b1e961c37ef3cc8dcc1a152c78ed9434:2f81d3a8878e2bc0cdb267e598e23f746014ad24e7c1dba335fe476368d129f3

❯ docker tag ko.local/test-b1e961c37ef3cc8dcc1a152c78ed9434:2f81d3a8878e2bc0cdb267e598e23f746014ad24e7c1dba335fe476368d129f3 ghcr.io/lirlia/framinal-new-tools/go-test:latest

❯ docker push ghcr.io/lirlia/framinal-new-tools/go-test:latest
The push refers to repository [ghcr.io/lirlia/framinal-new-tools/go-test]
3177056de767: Layer already exists 
ffe56a1c5f38: Layer already exists 
918c043d16fb: Layer already exists 

リポジトリ側に push されている。GitHub - lirlia/framinal-new-tools