@kyanny's blog

My thoughts, my life. Views/opinions are my own.

GitHub Container Registry (GHCR) に OCI イメージをプッシュする

TL;DR

skopeo copy oci:IMAGE:TAG docker://ghcr.io/OWNER/IMAGE:TAG

全体的な流れは Working with the Container registry - GitHub Docs に準ずるが、

  • docker コマンドは使えないので代替コマンドを用意する(今回は skopeo を使った。podman とかでも良いのかも)
  • OCI イメージを用意する必要がある(今回は skopeo で既存の Docker イメージを OCI イメージに変換した)

Docker イメージを OCI イメージに変換する方法は OCI Image Format Specification v1.0.1を読んで | うなすけとあれこれ に具体的に書いてある。ただし macOS で skopeo を使っていて Linux 用の Docker イメージを扱う場合は --override-os linux オプションの指定が必要。

skopeo --override-os linux copy docker://ubuntu:22.04 oci:ubuntu-oci:22.04

わかりやすさのために、OCI イメージ名はあえて ubuntu-oci とした。

oci:XXX:XXX という書式の意味は skopeo man page - General Commands | ManKier(Image Names)に書いてある。OCI イメージとしてコピーする場合は transport として oci: を指定する必要あり、ということかな。

skopeo copy コマンドはコンテナイメージを任意の場所へコピーするコマンドだが、その際に transport の指定によってイメージフォーマットの変換も行える、ということみたい。

GHCR への「コピー」(プッシュ)も skopeo copy で行う。なので skopeo login で ghcr.io にログインしておかないといけない。

skopeo login --username kyanny ghcr.io

パスワードを聞かれるので、Working with the Container registry - GitHub Docs に書いてある docker login と同じ要領で personal access token をパスワード代わりに食わせてやる。

ここまでできたらいよいよプッシュする。コピー先の指定時に docker:// をつけるのを忘れないこと。

skopeo copy oci:ubuntu-oci:22.04 docker://ghcr.io/OWNER/ubuntu-oci:22.04

コピー元と違うイメージ名でプッシュしても良い。

skopeo copy oci:ubuntu-oci:22.04 docker://ghcr.io/OWNER/ubuntu-oci-2:22.04