Tentang ringkasan image container


Dokumen ini menjelaskan ringkasan image, termasuk apa yang dimaksud dengan ringkasan image, cara menemukannya, dan cara menerapkan penggunaannya dalam cluster Kubernetes. Dokumen ini ditujukan bagi developer dan operator yang membangun dan men-deploy image container.

Ringkasan image container secara unik dan tetap mengidentifikasi image container. Dengan men-deploy image berdasarkan ringkasan, Anda telah menghindari kelemahan deployment menggunakan tag image.

Perintah dalam dokumen ini mengasumsikan bahwa Anda memiliki akses ke lingkungan shell Linux atau macOS melalui alat seperti Google Cloud CLI, Docker, cURL, jq, dan pack sudah diinstal. Anda juga dapat menggunakan Cloud Shell yang telah menginstal alat-alat ini.

Image container dan tag image

Saat menangani image container, Anda memerlukan cara untuk merujuk ke image yang Anda gunakan. Tag image adalah cara umum untuk merujuk ke berbagai revisi image. Pendekatan umumnya adalah memberi tag pada image dengan ID versi pada waktu build. Misalnya, v1.0.1 dapat merujuk ke versi yang Anda panggil 1.0.1.

Dengan tag, revisi image bisa dengan mudah dicari dengan string yang dapat dibaca manusia. Namun, tag adalah referensi yang dapat diubah, yang berarti image yang dirujuk oleh tag dapat berubah, seperti yang ditunjukkan dalam diagram berikut:

Tag image yang mengarah ke image lama.

Seperti yang ditunjukkan diagram sebelumnya, jika Anda memublikasikan image baru menggunakan tag yang sama seperti image yang ada, tag akan berhenti mengarah ke image yang ada dan mulai menunjuk ke image baru.

Kekurangan tag image

Karena dapat diubah, tag memiliki beberapa kekurangan berikut saat Anda menggunakannya untuk men-deploy image:

  • Di Kubernetes, men-deploy berdasarkan tag dapat mengakibatkan hasil yang tidak diharapkan. Misalnya, anggap saja Anda sudah memiliki resource Deployment yang merujuk ke image container dengan tag v1.0.1. Untuk memperbaiki bug atau membuat perubahan kecil, proses build Anda akan membuat image baru dengan tag v1.0.1 yang sama. Pod baru yang dibuat dari resource Deployment bisa jadi pada akhirnya akan menggunakan image lama atau baru meskipun Anda tidak mengubah spesifikasi resource Deployment. Masalah ini juga berlaku untuk resource Kubernetes lainnya seperti StatefulSets, DaemonSets, ReplicaSets, dan Jobs.

  • Jika Anda menggunakan alat untuk memindai atau menganalisis image, hasil dari alat ini hanya valid untuk image yang dipindai. Untuk memastikan bahwa Anda men-deploy image yang telah dipindai, Anda tidak dapat mengandalkan tag karena image yang dirujuk oleh tag mungkin telah berubah.

  • Jika Anda menggunakan Otorisasi Biner dengan Google Kubernetes Engine (GKE), deployment berbasis tag tidak diizinkan karena tidak dapat menentukan image pasti yang digunakan saat Pod dibuat.

Saat men-deploy image, Anda dapat menggunakan ringkasan image untuk menghindari kerugian akibat penggunaan tag. Anda masih dapat menambahkan tag ke image jika mau, tetapi tidak perlu melakukannya.

Struktur image

Image terdiri atas komponen berikut:

Komponen ini diilustrasikan dalam diagram berikut:

Komponen image yang menampilkan detail manifes image, objek konfigurasi, lapisan sistem file, dan indeks image.

Image sebelumnya menampilkan detail tambahan terkait komponen image:

  • Manifes image adalah dokumen JSON yang berisi referensi ke objek konfigurasi, lapisan sistem file, dan metadata opsional.
  • Manifes image merujuk ke objek konfigurasi dan setiap lapisan sistem file menggunakan atribut digest-nya. Nilai atribut digest adalah hash kriptografis dari konten yang dirujuk oleh ringkasan, biasanya dihitung menggunakan algoritma SHA-256.
  • Nilai ringkasan digunakan untuk membuat alamat yang tidak dapat diubah oleh objek. Proses ini disebut penyimpanan alamat konten, dan artinya Anda dapat mengambil manifes image, indeks image, objek konfigurasi, dan lapisan berdasarkan ringkasannya.
  • Ringkasan image adalah hash indeks image atau dokumen JSON manifes image.
  • Objek konfigurasi adalah dokumen JSON yang menentukan properti image, seperti arsitektur CPU, titik entri, port yang diekspos, dan variabel lingkungan.
  • Array lapisan sistem file menentukan urutan yang digunakan runtime container untuk menumpuk lapisan. Lapisan didistribusikan sebagai file tar, biasanya dikompresi menggunakan utilitas gzip.
  • Indeks image opsional, yang terkadang disebut sebagai daftar manifes, mengacu pada satu atau beberapa manifes image. Referensinya adalah ringkasan manifes image. Indeks image berguna ketika Anda menghasilkan beberapa image yang terkait untuk berbagai platform, seperti arsitektur amd64 dan arm64.

Untuk mengetahui informasi selengkapnya, lihat bagian Mempelajari manifes, ringkasan, dan tag image.

Mencari ringkasan image

Agar dapat menggunakan ringkasan image untuk deployment, Anda harus mencari ringkasan terlebih dahulu. Kemudian, Anda dapat menggunakan ringkasan dengan perintah deployment atau menyertakannya dalam manifes Kubernetes.

Anda dapat memperoleh ringkasan image dengan berbagai cara, bergantung pada situasi Anda saat ini. Bagian berikut berisi contoh untuk berbagai produk dan alat.

Di bagian berikut, jalankan perintah di Cloud Shell atau di lingkungan shell dengan alat seperti gcloud CLI, Docker, cURL, dan jq yang sudah terinstal.

Artifact Registry

Container Registry

  • Untuk image yang disimpan di Container Registry, Anda dapat menggunakan perintah gcloud container images describe untuk mendapatkan ringkasan image dengan memberikan nama dan tag. Gunakan flag --format hanya untuk menampilkan ringkasan:

    gcloud container images describe \
        gcr.io/google-containers/pause-amd64:3.2 \
        --format 'value(image_summary.digest)'
    

    Output-nya akan terlihat mirip dengan berikut ini meskipun nilai ringkasan Anda mungkin berbeda:

    sha256:4a1c4b21597c1b4415bdbecb28a3296c6b5e23ca4f9feeb599860a1dac6a0108
    

Cloud Build

Untuk image yang dibangun menggunakan Cloud Build, Anda bisa mendapatkan ringkasan image menggunakan perintah gcloud builds describe dengan flag --format. Pendekatan ini tetap dapat berfungsi meskipun Anda menggunakan registry apa pun untuk memublikasikan image.

  • Untuk build yang sudah selesai, lakukan langkah berikut:

    1. Dapatkan daftar build untuk project Anda:

      gcloud builds list
      

      Catat BUILD_ID.

    2. Dapatkan ringkasan image:

      gcloud builds describe BUILD_ID \
          --format 'value(results.images[0].digest)'
      

      Ganti BUILD_ID dengan ID unik yang ditetapkan Cloud Build untuk build Anda.

  • Dapatkan nama image dan ringkasan build terbaru dari Cloud Build project Anda saat ini:

    gcloud builds describe \
        $(gcloud builds list --limit 1 --format 'value(id)') \
        --format 'value[separator="@"](results.images[0].name,results.images[0].digest)'
    
  • Jika build Anda menghasilkan beberapa image, filter output dan dapatkan ringkasan salah satu image:

    gcloud builds describe BUILD_ID --format json \
        | jq -r '.results.images[] | select(.name=="YOUR_IMAGE_NAME") | .digest'
    

    Ganti YOUR_IMAGE_NAME dengan nama salah satu image dari file cloudbuild.yaml.

  • Jika mengirimkan build ke Cloud Build menggunakan perintah gcloud builds submit, Anda dapat mengambil ringkasan image dari output dalam variabel lingkungan:

    IMAGE_DIGEST=$(gcloud builds submit \
        --format 'value(results.images[0].digest)' | tail -n1)
    

Buildpack Berbasis Cloud

  • Jika menggunakan Buildpack Berbasis Cloud dan builder Google Cloud untuk membuat dan memublikasikan image, Anda dapat mengambil nama dan ringkasan image menggunakan flag --quiet dengan perintah pack:

    pack build --builder gcr.io/buildpacks/builder:v1 --publish --quiet \
        LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE \
        > image-with-digest.txt
    

    Ganti kode berikut:

    • LOCATION: lokasi regional atau multi-regional dari repositori Anda
    • PROJECT_ID: project ID Google Cloud Anda
    • REPOSITORY: nama repositori Anda
    • IMAGE: nama image Anda

    File image-with-digest.txt berisi nama image dan ringkasan.

    Gunakan flag --tag jika Anda ingin menambahkan tag ke image.

Klien Docker

  • Subperintahmanifest pada klien command line docker dapat mengambil manifes image dan daftar manifes dari registry image container.

    Dapatkan ringkasan dari daftar manifes image registry.k8s.io/pause:3.9 untuk arsitektur CPU amd64 dan sistem operasi linux:

    docker manifest inspect --verbose registry.k8s.io/pause:3.9 | \
        jq -r 'if type=="object"
            then .Descriptor.digest
            else .[] | select(.Descriptor.platform.architecture=="amd64" and
            .Descriptor.platform.os=="linux") | .Descriptor.digest
            end'
    

    Output-nya terlihat mirip dengan yang berikut ini:

    sha256:8d4106c88ec0bd28001e34c975d65175d994072d65341f62a8ab0754b0fafe10
    
  • Untuk image yang disimpan di daemon Docker lokal, dan yang telah diambil dari atau dikirim ke registry image, Anda dapat menggunakan alat command line Docker untuk mendapatkan ringkasan image:

    1. Tarik image ke daemon Docker lokal Anda:

      docker pull docker.io/library/debian:bookworm
      
    2. Dapatkan ringkasan image:

      docker inspect docker.io/library/debian:bookworm \
          | jq -r '.[0].RepoDigests[0]' \
          | cut -d'@' -f2
      

      Output-nya terlihat mirip dengan yang berikut ini meskipun nilai ringkasan Anda mungkin berbeda:

      sha256:3d868b5eb908155f3784317b3dda2941df87bbbbaa4608f84881de66d9bb297b
      
  • Cantumkan semua image dan ringkasan di daemon Docker lokal Anda:

    docker images --digests
    

    Output-nya menunjukkan ringkasan untuk image yang memiliki nilai ringkasan. Image hanya memiliki nilai ringkasan jika diambil dari atau dikirim ke registry image.

crane dan gcrane

Anda dapat menggunakan alat command line crane dan gcrane open source untuk mendapatkan ringkasan image tanpa harus menarik image ke daemon Docker lokal.

  1. Download crane dan gcrane ke direktori Anda saat ini:

    VERSION=$(curl -sL https://api.github.com/repos/google/go-containerregistry/releases/latest | jq -r .tag_name)
    curl -L "https://github.com/google/go-containerregistry/releases/download/${VERSION}/go-containerregistry_$(uname -s)_$(uname -m).tar.gz" | tar -zxf - crane gcrane
    
  2. Dapatkan ringkasan image:

    ./gcrane digest gcr.io/distroless/static-debian11:nonroot
    

    crane dan gcrane memiliki fitur lain yang berada di luar cakupan dokumen ini. Untuk mengetahui informasi selengkapnya, lihat dokumentasi untuk crane dan gcrane.

Menerapkan penggunaan ringkasan image dalam deployment Kubernetes

Jika Anda ingin menerapkan penerapan menggunakan ringkasan untuk image yang di-deploy ke cluster Kubernetes, Anda dapat menggunakan Pengontrol Kebijakan atau Pemilah Komunikasi Open Policy Agent (OPA). Pengontrol Kebijakan dibangun dari project open source Pemilah Komunikasi OPA.

Pengontrol Kebijakan dan Pemilah Komunikasi OPA dibuat di mesin kebijakan OPA. Pengontrol Kebijakan dan Pemilah Komunikasi OPA memberikan Webhook penerimaan validasi Kubernetes untuk menegakkan kebijakan, dan definisi resource kustom (CRD) untuk template batasan dan batasan.

Template batasan berisi logika kebijakan yang dinyatakan menggunakan bahasa deklaratif tingkat tinggi yang disebut Rego. Berikut ini adalah template batasan yang memvalidasi bahwa container, container init, dan container sementara dalam spesifikasi resource Kubernetes menggunakan image dengan ringkasan:

apiVersion: templates.gatekeeper.sh/v1
kind: ConstraintTemplate
metadata:
  name: k8simagedigests
  annotations:
    metadata.gatekeeper.sh/title: "Image Digests"
    metadata.gatekeeper.sh/version: 1.0.1
    description: >-
      Requires container images to contain a digest.

      https://kubernetes.io/docs/concepts/containers/images/
spec:
  crd:
    spec:
      names:
        kind: K8sImageDigests
      validation:
        openAPIV3Schema:
          type: object
          description: >-
            Requires container images to contain a digest.

            https://kubernetes.io/docs/concepts/containers/images/
          properties:
            exemptImages:
              description: >-
                Any container that uses an image that matches an entry in this list will be excluded
                from enforcement. Prefix-matching can be signified with `*`. For example: `my-image-*`.

                It is recommended that users use the fully-qualified Docker image name (e.g. start with a domain name)
                in order to avoid unexpectedly exempting images from an untrusted repository.
              type: array
              items:
                type: string
  targets:
    - target: admission.k8s.gatekeeper.sh
      rego: |
        package k8simagedigests

        import data.lib.exempt_container.is_exempt

        violation[{"msg": msg}] {
          container := input.review.object.spec.containers[_]
          not is_exempt(container)
          not regex.match("@[a-z0-9]+([+._-][a-z0-9]+)*:[a-zA-Z0-9=_-]+", container.image)
          msg := sprintf("container <%v> uses an image without a digest <%v>", [container.name, container.image])
        }

        violation[{"msg": msg}] {
          container := input.review.object.spec.initContainers[_]
          not is_exempt(container)
          not regex.match("@[a-z0-9]+([+._-][a-z0-9]+)*:[a-zA-Z0-9=_-]+", container.image)
          msg := sprintf("initContainer <%v> uses an image without a digest <%v>", [container.name, container.image])
        }

        violation[{"msg": msg}] {
          container := input.review.object.spec.ephemeralContainers[_]
          not is_exempt(container)
          not regex.match("@[a-z0-9]+([+._-][a-z0-9]+)*:[a-zA-Z0-9=_-]+", container.image)
          msg := sprintf("ephemeralContainer <%v> uses an image without a digest <%v>", [container.name, container.image])
        }
      libs:
        - |
          package lib.exempt_container

          is_exempt(container) {
              exempt_images := object.get(object.get(input, "parameters", {}), "exemptImages", [])
              img := container.image
              exemption := exempt_images[_]
              _matches_exemption(img, exemption)
          }

          _matches_exemption(img, exemption) {
              not endswith(exemption, "*")
              exemption == img
          }

          _matches_exemption(img, exemption) {
              endswith(exemption, "*")
              prefix := trim_suffix(exemption, "*")
              startswith(img, prefix)
          }

Kebijakan sebelumnya berisi ekspresi reguler sebagai input untuk fungsi re_match. Ekspresi reguler ini cocok dengan ringkasan image container, dan didasarkan pada format ringkasan di Spesifikasi Image Open Container Initiative.

Batasan menerapkan kebijakan pada resource Kubernetes melalui pencocokan dengan atribut seperti kind dan namespace. Contoh batasan berikut menerapkan kebijakan dari template batasan ke semua resource Pod di namespace default.

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sImageDigests
metadata:
  name: container-image-must-have-digest
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    namespaces:
      - "default"

Setelah Anda membuat template batasan dan batasan, setiap pod baru di namespace default harus menggunakan ringkasan image untuk mereferensikan image container.

Untuk mengetahui contoh lengkapnya, lihat kebijakan imagedigests di library kebijakan Pemilah komunikasi.

Tentang manifes, ringkasan, dan tag image

Di bagian ini, Anda akan mempelajari cara menjelajahi image yang sudah ada di registry menggunakan alat command line seperti curl dan docker. Jalankan perintah di Cloud Shell atau di lingkungan shell dengan alat seperti gcloud CLI, Docker, cURL, dan jq yang sudah terinstal. Perintah berikut menggunakan image publik di Artifact Registry.

  • Dapatkan manifes gcr.io/google-containers/pause-amd64:3.2 image menggunakan cURL dan URL manifes:

    curl -s https://gcr.io/v2/google-containers/pause-amd64/manifests/3.2
    

    Outputnya mirip dengan hal berikut ini:

    {
       "schemaVersion": 2,
       "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
       "config": {
          "mediaType": "application/vnd.docker.container.image.v1+json",
          "size": 759,
          "digest": "sha256:80d28bedfe5dec59da9ebf8e6260224ac9008ab5c11dbbe16ee3ba3e4439ac2c"
       },
       "layers": [
          {
             "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
             "size": 296534,
             "digest": "sha256:c74f8866df097496217c9f15efe8f8d3db05d19d678a02d01cc7eaed520bb136"
          }
       ]
    }
    

    Bagian config memiliki atribut ringkasan, dan Anda dapat menggunakan nilai ini untuk mengambil objek konfigurasi. Demikian pula, setiap lapisan memiliki atribut digest yang dapat Anda gunakan untuk mengambil file tar untuk lapisan tersebut.

  • Jika image menyertakan indeks image opsional, permintaan GET HTTP ke URL manifes yang menggunakan tag akan menampilkan indeks image, bukan manifes image.

    Dapatkan indeks image dari gcr.io/google-containers/pause:3.2:

    curl -s https://gcr.io/v2/google-containers/pause/manifests/3.2
    

    Outputnya mirip dengan hal berikut ini:

    {
       "schemaVersion": 2,
       "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
       "manifests": [
          {
             "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
             "size": 526,
             "digest": "sha256:4a1c4b21597c1b4415bdbecb28a3296c6b5e23ca4f9feeb599860a1dac6a0108",
             "platform": {
                "architecture": "amd64",
                "os": "linux"
             }
          },
          {
             "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
             "size": 526,
             "digest": "sha256:bbb7780ca6592cfc98e601f2a5e94bbf748a232f9116518643905aa30fc01642",
             "platform": {
                "architecture": "arm",
                "os": "linux",
                "variant": "v7"
             }
          },
          {
             "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
             "size": 526,
             "digest": "sha256:31d3efd12022ffeffb3146bc10ae8beb890c80ed2f07363515580add7ed47636",
             "platform": {
                "architecture": "arm64",
                "os": "linux"
             }
          },
          {
             "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
             "size": 526,
             "digest": "sha256:7f82fecd72730a6aeb70713476fb6f7545ed1bbf32cadd7414a77d25e235aaca",
             "platform": {
                "architecture": "ppc64le",
                "os": "linux"
             }
          },
          {
             "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
             "size": 526,
             "digest": "sha256:1175fd4d728641115e2802be80abab108b8d9306442ce35425a4e8707ca60521",
             "platform": {
                "architecture": "s390x",
                "os": "linux"
             }
          }
       ]
    }
    
  • Filter hasilnya untuk mengekstrak ringkasan image untuk platform yang Anda inginkan. Dapatkan ringkasan manifes image untuk arsitektur CPU amd64 dan sistem operasi linux:

    curl -s https://gcr.io/v2/google-containers/pause/manifests/3.2 | \
        jq -r '.manifests[] | select(.platform.architecture=="amd64" and .platform.os=="linux") | .digest'
    

    Pemfilteran dalam perintah ini meniru cara runtime container, misalnya containerd, memilih image yang cocok dengan platform target dari indeks image.

    Outputnya mirip dengan hal berikut ini:

    sha256:4a1c4b21597c1b4415bdbecb28a3296c6b5e23ca4f9feeb599860a1dac6a0108
    

    Aplikasi ringkasan image adalah hasil penerapan hash yang tahan bentrok ke indeks image atau manifes image, biasanya algoritma SHA-256.

  • Dapatkan ringkasan image gcr.io/google-containers/pause-amd64:3.2:

    curl -s https://gcr.io/v2/google-containers/pause-amd64/manifests/3.2 \
        | shasum -a 256 \
        | cut -d' ' -f1
    

    Outputnya mirip dengan hal berikut ini:

    4a1c4b21597c1b4415bdbecb28a3296c6b5e23ca4f9feeb599860a1dac6a0108
    

    Anda dapat mereferensikan image ini menggunakan nilai ringkasan image sebagai berikut:

    gcr.io/google-containers/pause-amd64@sha256:4a1c4b21597c1b4415bdbecb28a3296c6b5e23ca4f9feeb599860a1dac6a0108
    
  • Dengan konsep penyimpanan alamat konten yang dapat diakses, dapatkan manifes image menggunakan ringkasan sebagai referensi:

    curl -s https://gcr.io/v2/google-containers/pause-amd64/manifests/sha256:4a1c4b21597c1b4415bdbecb28a3296c6b5e23ca4f9feeb599860a1dac6a0108
    
  • Banyak registry image container yang menampilkan ringkasan manifes, indeks image, objek konfigurasi, dan lapisan sistem file dalam header Docker-Content-Digest sebagai respons terhadap permintaan HEAD HTTP. Dapatkan ringkasan indeks image gcr.io/google-containers/pause-amd64:3.2:

    curl -s --head https://gcr.io/v2/google-containers/pause/manifests/3.2 \
        | grep -i Docker-Content-Digest \
        | cut -d' ' -f2
    

    Outputnya mirip dengan hal berikut ini:

    sha256:927d98197ec1141a368550822d18fa1c60bdae27b78b0c004f705f548c07814f
    

    Header Docker-Content-Digest tidak dimandatkan oleh spesifikasi Open Container Initiative Distribution sehingga pendekatan ini mungkin tidak berfungsi di semua registry image container. Anda dapat menggunakannya dengan Artifact Registry dan Container Registry.

  • Untuk mengambil objek konfigurasi image menggunakan nilai digest dari manifes image, lakukan langkah berikut:

    1. Dapatkan ringkasan konfigurasi:

      CONFIG_DIGEST=$(curl -s https://gcr.io/v2/google-containers/pause-amd64/manifests/3.2 \
          | jq -r '.config.digest')
      
    2. Gunakan ringkasan konfigurasi untuk mengambil objek konfigurasi, dan gunakan jq untuk memformat output agar lebih mudah dibaca:

      curl -sL https://gcr.io/v2/google-containers/pause-amd64/blobs/$CONFIG_DIGEST \
          | jq
      

      Outputnya mirip dengan hal berikut ini:

      {
        "architecture": "amd64",
        "config": {
          "Env": [
            "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
          ],
          "Entrypoint": [
            "/pause"
          ],
          "WorkingDir": "/",
          "OnBuild": null
        },
        "created": "2020-02-14T10:51:50.60182885-08:00",
        "history": [
          {
            "created": "2020-02-14T10:51:50.60182885-08:00",
            "created_by": "ARG ARCH",
            "comment": "buildkit.dockerfile.v0",
            "empty_layer": true
          },
          {
            "created": "2020-02-14T10:51:50.60182885-08:00",
            "created_by": "ADD bin/pause-amd64 /pause # buildkit",
            "comment": "buildkit.dockerfile.v0"
          },
          {
            "created": "2020-02-14T10:51:50.60182885-08:00",
            "created_by": "ENTRYPOINT [\"/pause\"]",
            "comment": "buildkit.dockerfile.v0",
            "empty_layer": true
          }
        ],
        "os": "linux",
        "rootfs": {
          "type": "layers",
          "diff_ids": [
            "sha256:ba0dae6243cc9fa2890df40a625721fdbea5c94ca6da897acdd814d710149770"
          ]
        }
      }
      
  • Untuk mengambil lapisan sistem file menggunakan nilai ringkasan dari manifes image, lakukan langkah berikut:

    1. Dapatkan ringkasan lapisan yang ingin Anda ambil:

      LAYER_DIGEST=$(curl -s https://gcr.io/v2/google-containers/pause-amd64/manifests/3.2 \
          | jq -r '.layers[0].digest')
      
    2. Gunakan ringkasan lapisan untuk mengambil file tar lapisan, lalu cantumkan kontennya:

      curl -sL https://gcr.io/v2/google-containers/pause-amd64/blobs/$LAYER_DIGEST \
          | tar --list
      

      Lapisan ini hanya memiliki satu file, bernama pause.

  • Untuk mencari tag yang terkait dengan ringkasan image, lakukan langkah berikut:

    1. Tentukan ringkasan yang ingin Anda cari:

      IMAGE_DIGEST=$(curl -s https://gcr.io/v2/google-containers/pause-amd64/manifests/3.2 \
          | shasum -a 256 \
          | cut -d' ' -f1)
      

      Variabel lingkungan IMAGE_DIGEST berisi ringkasan image yang direferensikan oleh tag 3.2.

    2. Gunakan endpoint daftar tag image, /tags/list, untuk mencantumkan informasi tag, dan mengekstrak tag untuk nilai ringkasan:

      curl -s "https://gcr.io/v2/google-containers/pause-amd64/tags/list?n=1" \
          | jq ".manifest.\"sha256:$IMAGE_DIGEST\".tag"
      

      Outputnya mirip dengan hal berikut ini:

      [
        "3.2"
      ]
      
  • Untuk mendapatkan manifes image dari repositori image container Artifact Registry menggunakan cURL, sertakan token akses di header permintaan Authorization:

    curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        https://LOCATION-docker.pkg.dev/v2/PROJECT_ID/REPOSITORY/IMAGE/manifests/DIGEST
    

    Ganti kode berikut:

    • LOCATION: lokasi regional atau multi-regional dari repositori Anda
    • PROJECT_ID: project ID Google Cloud Anda
    • REPOSITORY: nama repositori Anda
    • IMAGE: nama image Anda
    • DIGEST: ringkasan image Anda dalam format sha256:DIGEST_VALUE

Langkah selanjutnya