Closed12

Docker HubにOCI Artifactsをpushしてみる

Futa HirakobaFuta Hirakoba

これ

Announcing Docker Hub OCI Artifacts Support - Docker
https://www.docker.com/blog/announcing-docker-hub-oci-artifacts-support/

Futa HirakobaFuta Hirakoba

まとめ

  • docker hubにoci artifactsはpushできた
    • docker hubはストレージ大丈夫なのかな
  • oras便利
    • マジで簡単にpushできた
  • 何かしらのファイルを上げたい時に使えそう。バイナリとか
    • とはいえghcr.ioで良くね?感はある
Futa HirakobaFuta Hirakoba

ghcr.io に OCI Artifacts を push してみる

まずはね

Futa HirakobaFuta Hirakoba

チュートリアルっぽいのやってみる。
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


Package hello-artifact

おお〜

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"
  }
}

レイヤーのmediaTypetext/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"
  }
}

レイヤーのmediaTypeapplication/vnd.oci.image.layer.v1.tarになってる

Futa HirakobaFuta Hirakoba

Docker Hub に OCI Artifacts を push してみる

本題

Futa HirakobaFuta Hirakoba

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"
  }
}
Futa HirakobaFuta Hirakoba

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として認識された

このスクラップは2022/11/10にクローズされました