Docker HubにOCI Artifactsをpushしてみる
これ
Announcing Docker Hub OCI Artifacts Support - Docker
まとめ
- docker hubにoci artifactsはpushできた
- docker hubはストレージ大丈夫なのかな
- oras便利
- マジで簡単にpushできた
- 何かしらのファイルを上げたい時に使えそう。バイナリとか
- とはいえghcr.ioで良くね?感はある
そもそもOCI Artifactsの作り方というかpushの仕方がわからん
OCI Artifactsについて
opencontainers/artifacts: OCI Artifacts
CNCFのORASというツールが載ってる
ORASとやらを使えば実現できそう。
OCI Registry As Storage
ghcr.io に OCI Artifacts を push してみる
まずはね
oras cliのインスコ
brew install oras
❯ oras version
Version: 0.16.0+Homebrew
Go version: go1.19.3
チュートリアルっぽいのやってみる。
Pushing - OCI Registry As Storage
GitHubのPATを生成
fine-grained patはまだpackagesに対応してなかったので、classic patを利用。
write:packages
を付与。
ログイン
❯ echo $GITHUB_PAT | oras login ghcr.io -u korosuke613 --password-stdin
Login Succeeded
pushするアーティファクトの作成
といってもファイル作るだけ
echo "hello world" > artifact.txt
push
これだけでいいのか
コマンド
oras push ghcr.io/korosuke613/hello-artifact:v1 \
--artifact-type application/vnd.acme.rocket.config \
./artifact.txt
結果
❯ oras push ghcr.io/korosuke613/hello-artifact:v1 \
--artifact-type application/vnd.acme.rocket.config \
./artifact.txt
Uploading a948904f2f0f artifact.txt
Uploaded a948904f2f0f artifact.txt
Pushed ghcr.io/korosuke613/hello-artifact:v1
Digest: sha256:2f5958582f3044c9eab077de6c4f40a825ac7d50bf4e33032e578d06c487eca8
おお〜
pull
oras pull ghcr.io/korosuke613/hello-artifact:v1
でできる。
❯ rm -f artifact.txt
❯ oras pull ghcr.io/korosuke613/hello-artifact:v1
Downloading a948904f2f0f artifact.txt
Downloaded a948904f2f0f artifact.txt
Pulled ghcr.io/korosuke613/hello-artifact:v1
Digest: sha256:2f5958582f3044c9eab077de6c4f40a825ac7d50bf4e33032e578d06c487eca8
❯ cat ./artifact.txt
hello world
おお〜
ちなみにdocker pull
はできなかった。
❯ docker pull ghcr.io/korosuke613/hello-artifact:v1
v1: Pulling from korosuke613/hello-artifact
a948904f2f0f: Pulling fs layer
invalid rootfs in image configuration
push時にファイルタイプを指定
❯ oras push ghcr.io/korosuke613/hello-artifact:v2 \
--artifact-type application/vnd.acme.rocket.config \
./artifact.txt:text/plain
Exists a948904f2f0f artifact.txt
Pushed ghcr.io/korosuke613/hello-artifact:v2
Digest: sha256:dedb9f33dc12952cae93c8049e8c42db36c08a944a54cb9cd23f334d789f1cf4
oras manifest fetch ghcr.io/korosuke613/hello-artifact:v2 | jq
でマニフェストを確認。
{
"schemaVersion": 2,
"mediaType": "application/vnd.oci.image.manifest.v1+json",
"config": {
"mediaType": "application/vnd.acme.rocket.config",
"digest": "sha256:44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a",
"size": 2
},
"layers": [
{
"mediaType": "text/plain",
"digest": "sha256:a948904f2f0f479b8f8197694b30184b0d2ed1c1cd2a1ec0fb85d299a192a447",
"size": 12,
"annotations": {
"org.opencontainers.image.title": "artifact.txt"
}
}
],
"annotations": {
"org.opencontainers.image.created": "2022-11-10T01:51:04Z"
}
}
レイヤーのmediaType
がtext/plain
になってる。
v1も確認。
oras manifest fetch ghcr.io/korosuke613/hello-artifact:v1 | jq
{
"schemaVersion": 2,
"mediaType": "application/vnd.oci.image.manifest.v1+json",
"config": {
"mediaType": "application/vnd.acme.rocket.config",
"digest": "sha256:44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a",
"size": 2
},
"layers": [
{
"mediaType": "application/vnd.oci.image.layer.v1.tar",
"digest": "sha256:a948904f2f0f479b8f8197694b30184b0d2ed1c1cd2a1ec0fb85d299a192a447",
"size": 12,
"annotations": {
"org.opencontainers.image.title": "artifact.txt"
}
}
],
"annotations": {
"org.opencontainers.image.created": "2022-11-10T01:49:19Z"
}
}
レイヤーのmediaType
がapplication/vnd.oci.image.layer.v1.tar
になってる
Docker Hub に OCI Artifacts を push してみる
本題
pushするやつはghcr.io向けに作ったartifacts.txt
を使う。
Docker HubのPATを生成
ScopeはRead & Write
にした。
認証
❯ oras login docker.io -u korosuke613
Password:
Login Succeeded
別にechoで渡さんでもよかった
push
❯ oras push docker.io/korosuke613/hello-artifact:v1 \
--artifact-type application/vnd.acme.rocket.config \
./artifact.txt:text/plain
Uploading a948904f2f0f artifact.txt
Uploaded a948904f2f0f artifact.txt
Pushed docker.io/korosuke613/hello-artifact:v1
Digest: sha256:510c11c28a0a77ff2ebff6493e9f2b2ba90ebbfa226601607863c67cf86a6883
普通にできた。
korosuke613/hello-artifact - Docker Image | Docker Hub
pull
❯ docker pull korosuke613/hello-artifact:v1
v1: Pulling from korosuke613/hello-artifact
a948904f2f0f: Extracting 12B/12B
invalid rootfs in image configuration
やはりdocker pull
はできない。
❯ oras pull docker.io/korosuke613/hello-artifact:v1
Downloading a948904f2f0f artifact.txt
Downloaded a948904f2f0f artifact.txt
Pulled docker.io/korosuke613/hello-artifact:v1
Digest: sha256:510c11c28a0a77ff2ebff6493e9f2b2ba90ebbfa226601607863c67cf86a6883
oras pull
はできた!
もちろんマニフェストも取れるよ
oras manifest fetch docker.io/korosuke613/hello-artifact:v1 | jq
{
"schemaVersion": 2,
"mediaType": "application/vnd.oci.image.manifest.v1+json",
"config": {
"mediaType": "application/vnd.acme.rocket.config",
"digest": "sha256:44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a",
"size": 2
},
"layers": [
{
"mediaType": "text/plain",
"digest": "sha256:a948904f2f0f479b8f8197694b30184b0d2ed1c1cd2a1ec0fb85d299a192a447",
"size": 12,
"annotations": {
"org.opencontainers.image.title": "artifact.txt"
}
}
],
"annotations": {
"org.opencontainers.image.created": "2022-11-10T02:13:32Z"
}
}
Volumeとしたい場合はartifact typeにapplication/vnd.docker.volume.v1+tar.gz
を指定しろって書いてたわ(とはいえそこは別にVolumeとして認識されないだけで任意のものでいいっぽい)。
Here’s where the magic happens. The media type Docker Hub needs to successfully recognize the OCI image as a volume is
application/vnd.docker.volume.v1+tar.gz
https://www.docker.com/blog/announcing-docker-hub-oci-artifacts-support/
❯ oras push docker.io/korosuke613/hello-artifact:v2 \
--artifact-type application/vnd.docker.volume.v1+tar.gz \
./artifact.txt:text/plain
Exists a948904f2f0f artifact.txt
Pushed docker.io/korosuke613/hello-artifact:v2
Digest: sha256:a1951beb49934ab544985c3c0ef8a4966a4e5f7146c5cd298d77179bdc646a20
TypeがVolumeとして認識された