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