컨테이너 이미지 다이제스트 정보


이 문서에서는 이미지 다이제스트의 정의, 검색 방법, Kubernetes 클러스터에서의 사용 방법을 포함하여 이미지 다이제스트에 대해 설명합니다. 이 문서는 컨테이너 이미지를 빌드하고 배포하는 개발자 및 운영자를 대상으로 작성되었습니다.

컨테이너 이미지 다이제스트는 컨테이너 이미지를 고유하고 변경 불가능하게 식별합니다. 다이제스트를 통해 이미지를 배포하면 이미지 태그로 배포할 때의 단점을 피할 수 있습니다.

이 문서의 명령어에서는 사용자가 Google Cloud CLI, Docker, cURL, jq, pack과 같은 도구가 이미 설치된 Linux 또는 macOS 셸 환경에 대한 액세스 권한이 있다고 가정합니다. 또는 이러한 도구가 미리 설치된 Cloud Shell을 사용할 수 있다고 가정합니다.

컨테이너 이미지 및 이미지 태그

컨테이너 이미지를 사용할 때는 사용되는 이미지를 참조할 수 있는 방법이 필요합니다. 이미지 태그는 이미지의 여러 버전을 참조하기 위한 일반적인 방법입니다. 일반적인 방법은 빌드 시 이미지에 버전 식별자를 태그로 지정하는 것입니다. 예를 들어 v1.0.11.0.1에 호출하는 버전을 참조할 수 있습니다.

태그를 사용하면 인간이 읽을 수 있는 문자열을 사용해서 이미지 버전을 쉽게 조회할 수 있습니다. 하지만 태그는 가변적인 참조 방식입니다. 즉, 다음 다이어그램에 표시된 것처럼 하나의 태그로 참조되는 이미지가 변경될 수 있습니다.

오래된 이미지를 가리키는 이미지 태그

이전 다이어그램에 표시된 것처럼 기존 이미지와 동일한 태그를 사용하여 새 이미지를 게시하면 태그는 기존 이미지를 가리키는 것을 중지하고 새 이미지를 가리키기 시작합니다.

이미지 태그의 단점

태그가 가변적이기 때문에 이를 사용하여 이미지를 배포할 때는 다음과 같은 단점이 있습니다.

  • Kubernetes에서 태그로 배포하면 예기치 않은 결과가 발생할 수 있습니다. 예를 들어 v1.0.1 태그로 컨테이너 이미지를 참조하는 기존 배포 리소스가 있다고 가정해보세요. 버그를 수정하거나 약간의 변경이 필요하면 빌드 프로세스에 따라 동일한 v1.0.1 태그를 사용하여 새 이미지가 생성됩니다. 배포 리소스에서 생성된 새 포드는 사용자가 배포 리소스 사양을 변경하지 않더라도 이전 또는 새로운 이미지 중 하나를 사용하게 될 수 있습니다. 이 문제는 StatefulSets, DaemonSets, ReplicaSets, Jobs와 같은 다른 Kubernetes 리소스에도 적용됩니다.

  • 이미지 스캔 또는 분석을 위해 도구를 사용할 경우 이러한 도구의 결과는 스캔된 이미지에 대해서만 유효합니다. 스캔된 이미지를 배포하도록 보장하기 위해서는 태그로 참조되는 이미지가 변경될 수 있기 때문에 태그에 의존할 수 없습니다.

  • Google Kubernetes Engine(GKE)에서 Binary Authorization을 사용하면 태그 기반 배포가 허용되지 않습니다. 포드가 생성될 때 사용되는 정확한 이미지를 결정하는 것이 불가능하기 때문입니다.

이미지를 배포할 때는 이미지 다이제스트를 사용하여 태그 사용에 따른 단점을 피할 수 있습니다. 필요에 따라 이미지에 태그를 추가할 수도 있지만, 필수는 아닙니다.

이미지 구조

이미지는 다음과 같은 구성요소로 구성됩니다.

다음 다이어그램은 이러한 구성요소를 보여줍니다.

이미지 매니페스트, 구성 객체, 파일 시스템 레이어, 이미지 인덱스에 대한 세부정보를 보여주는 이미지의 구성요소입니다.

위 이미지는 이미지 구성요소에 대한 추가 세부정보를 보여줍니다.

  • 이미지 매니페스트는 구성 객체, 파일 시스템 레이어, 선택적인 메타데이터에 대한 참조를 포함하는 JSON 문서입니다.
  • 이미지 매니페스트는 구성 객체 및 해당 digest 속성을 사용하는 각 파일 시스템 레이어를 참조합니다. digest 속성의 값은 일반적으로 SHA-256 알고리즘을 사용하여 계산되는, 다이제스트가 참조하는 콘텐츠의 암호화 해시입니다.
  • 다이제스트 값은 객체에 변경할 수 없는 주소를 생성하기 위해 사용됩니다. 이 프로세스를 콘텐츠 지정 가능 스토리지라고 부릅니다. 즉, 해당 다이제스트를 기준으로 이미지 매니페스트, 이미지 인덱스, 구성 객체, 레이어를 검색할 수 있습니다.
  • 이미지 다이제스트는 이미지 색인이나 이미지 매니페스트 JSON 문서의 해시입니다.
  • 구성 객체는 CPU 아키텍처, 진입점, 노출된 포트, 환경 변수와 같은 이미지 속성을 정의하는 JSON 문서입니다.
  • 파일 시스템 레이어는 컨테이너 런타임이 레이어 스택을 위해 사용하는 순서를 정의합니다. 레이어는 일반적으로 gzip 유틸리티를 사용하여 압축되는 tar 파일로 배포됩니다.
  • 매니페스트 목록이라고도 부르는 선택적인 이미지 인덱스는 하나 이상의 이미지 매니페스트를 참조합니다. 이러한 참조는 이미지 매니페스트의 다이제스트입니다. 이미지 인덱스는 amd64arm64 아키텍처와 같이 서로 다른 플랫폼에 대해 여러 관련 이미지를 생성할 때 유용합니다.

자세한 내용은 이미지 매니페스트, 다이제스트, 태그 탐색을 참조하세요.

이미지 다이제스트 찾기

배포에 이미지 다이제스트를 사용하려면 먼저 다이제스트를 찾아야 합니다. 그런 후 다이제스트를 배포 명령어와 함께 사용하거나 Kubernetes 매니페스트에 포함할 수 있습니다.

현재 상황에 따라 여러 방법으로 이미지 다이제스트를 가져올 수 있습니다. 다음 섹션에는 여러 다른 제품 및 도구에 대한 예시가 포함되어 있습니다.

다음 섹션에서는 gcloud CLI, Docker, cURL, jq와 같은 도구가 이미 설치되어 있는 셸 환경 또는 Cloud Shell에서 명령어를 실행합니다.

Artifact Registry

Container Registry

  • Container Registry에 저장된 이미지의 경우 gcloud container images describe 명령어를 사용해서 이름 및 태그를 제공하여 이미지 다이제스트를 가져올 수 있습니다. --format 플래그를 사용하여 다이제스트만 표시합니다.

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

    다이제스트 값은 다를 수 있지만 출력은 다음과 유사합니다.

    sha256:4a1c4b21597c1b4415bdbecb28a3296c6b5e23ca4f9feeb599860a1dac6a0108
    

Cloud Build

Cloud Build를 사용하여 빌드된 이미지의 경우 gcloud builds describe 명령어--format 플래그와 함께 사용하여 이미지 다이제스트를 가져올 수 있습니다. 이 방법은 이미지 게시에 사용된 레지스트리에 관계없이 작동합니다.

  • 이미 완료된 빌드의 경우 다음을 수행합니다.

    1. 프로젝트의 빌드 목록을 가져옵니다.

      gcloud builds list
      

      BUILD_ID를 기록합니다.

    2. 이미지 다이제스트를 가져옵니다.

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

      BUILD_ID를 Cloud Build가 빌드에 할당한 고유 ID로 바꿉니다.

  • 현재 프로젝트의 Cloud Build에서 최신 빌드에 대해 이미지 이름 및 다이제스트를 가져옵니다.

    gcloud builds describe \
        $(gcloud builds list --limit 1 --format 'value(id)') \
        --format 'value[separator="@"](results.images[0].name,results.images[0].digest)'
    
  • 빌드로 여러 이미지가 생성된 경우 출력을 필터링하고 이미지 중 하나의 다이제스트를 가져옵니다.

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

    YOUR_IMAGE_NAMEcloudbuild.yaml 파일의 이미지 이름 중 하나로 바꿉니다.

  • gcloud builds submit 명령어를 사용하여 Cloud Build에 빌드를 제출하는 경우 환경 변수의 출력에서 이미지 다이제스트를 캡처할 수 있습니다.

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

Cloud Native Buildpack

  • Cloud Native Buildpack 및 Google Cloud 빌더를 사용하여 이미지를 빌드하고 게시하는 경우 pack 명령어와 함께 --quiet 플래그를 사용하여 이미지 이름과 다이제스트를 캡처할 수 있습니다.

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

    다음을 바꿉니다.

    image-with-digest.txt 파일에는 이미지 이름과 다이제스트가 있습니다.

    태그를 이미지에 추가하려면 --tag 플래그를 사용하세요.

Docker 클라이언트

  • docker 명령줄 클라이언트의 manifest 하위 명령어는 컨테이너 이미지 레지스트리에서 이미지 매니페스트와 매니페스트 목록을 가져올 수 있습니다.

    amd64 CPU 아키텍처와 linux 운영체제에 대해 이미지 registry.k8s.io/pause:3.9의 매니페스트 목록에서 다이제스트를 가져옵니다.

    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'
    

    결과는 다음과 유사합니다.

    sha256:8d4106c88ec0bd28001e34c975d65175d994072d65341f62a8ab0754b0fafe10
    
  • 로컬 Docker 데몬에 저장되고 이미지 레지스트리로 가져오거나 이미지 레지스트리로 푸시한 이미지의 경우 Docker 명령줄 도구를 사용하여 이미지 다이제스트를 가져올 수 있습니다.

    1. 로컬 Docker 데몬으로 이미지를 가져옵니다.

      docker pull docker.io/library/debian:bookworm
      
    2. 이미지 다이제스트를 가져옵니다.

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

      다이제스트 값은 다를 수 있지만 출력은 다음과 유사합니다.

      sha256:3d868b5eb908155f3784317b3dda2941df87bbbbaa4608f84881de66d9bb297b
      
  • 로컬 Docker 데몬에 있는 모든 이미지 및 다이제스트를 나열합니다.

    docker images --digests
    

    출력에 다이제스트 값이 있는 이미지의 다이제스트가 표시됩니다. 이미지는 이미지 레지스트리에서 가져오거나 이미지 레지스트리로 푸시한 경우에만 다이제스트 값을 갖습니다.

cranegcrane

이미지를 로컬 Docker 데몬으로 가져오지 않아도 오픈소스 cranegcrane 명령줄 도구를 사용하여 이미지의 다이제스트를 가져올 수 있습니다.

  1. cranegcrane을 현재 디렉터리로 다운로드합니다.

    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. 이미지 다이제스트를 가져옵니다.

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

    cranegcrane에는 이 문서에서 다루지 않는 다른 기능이 포함되어 있습니다. 자세한 내용은 cranegcrane 문서를 참조하세요.

Kubernetes 배포에서 이미지 다이제스트 사용 적용

Kubernetes 클러스터에 배포하는 이미지에 다이제스트 사용을 적용하려는 경우 정책 컨트롤러 또는 Open Policy Agent(OPA) Gatekeeper를 사용할 수 있습니다. 정책 컨트롤러는 OPA Gatekeeper 오픈소스 프로젝트에서 빌드됩니다.

정책 컨트롤러와 OPA Gatekeeper는 모두 OPA 정책 엔진을 기반으로 합니다. 정책 컨트롤러와 OPA Gatekeeper는 정책을 시행하기 위한 Kubernetes 검증 승인 웹훅제약조건 템플릿제약조건에 대한 커스텀 리소스 정의(CRD)를 제공합니다.

제약조건 템플릿에는 Rego라고 부르는 고급 선언적 언어를 사용하여 표현되는 정책 논리가 포함됩니다. 다음은 Kubernetes 리소스 사양의 컨테이너, 초기화 컨테이너, 임시 컨테이너에서 다이제스트와 이미지를 사용하는지 확인하는 제약조건 템플릿입니다.

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

위 정책에는 re_match 함수에 대한 입력으로 정규 표현식이 포함됩니다. 이 정규 표현식은 컨테이너 이미지 다이제스트와 일치하며, 개방형 컨테이너 이니셔티브 이미지 사양의 다이제스트 형식을 기준으로 합니다.

제약조건은 kindnamespace와 같은 속성과 일치하는지 확인하여 Kubernetes 리소스에 정책을 적용합니다. 다음 예시 제약조건은 제약조건 템플릿의 정책을 default 네임스페이스에 있는 모든 Pod 리소스에 적용합니다.

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

제약조건 템플릿과 제약조건을 만든 후 default 네임스페이스의 새 포드는 이미지 다이제스트를 사용하여 컨테이너 이미지를 참조해야 합니다.

전체 예시는 Gatekeeper 정책 라이브러리의 imagedigests 정책을 참조하세요.

이미지 매니페스트, 다이제스트, 태그 정보

이 섹션에서는 curl, docker 등의 명령줄 도구를 사용하여 레지스트리의 기존 이미지를 탐색하는 방법을 알아봅니다. gcloud CLI, Docker, cURL, jq 같은 도구가 이미 설치되어 있는 셸 환경 또는 Cloud Shell에서 명령어를 실행합니다. 다음 명령어는 Artifact Registry에서 공개 이미지를 사용합니다.

  • cURL 및 매니페스트 URL을 사용하여 이미지 gcr.io/google-containers/pause-amd64:3.2의 매니페스트를 가져옵니다.

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

    출력은 다음과 비슷합니다.

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

    config 섹션에는 다이제스트 속성이 있고 이 값을 사용하여 구성 객체를 검색할 수 있습니다. 마찬가지로 각 레이어에는 해당 레이어의 tar 파일을 검색하기 위해 사용할 수 있는 digest 속성이 있습니다.

  • 이미지에 선택적인 이미지 인덱스가 포함된 경우 태그를 사용하여 매니페스트 URL에 대해 HTTP GET 요청을 수행하면 이미지 매니페스트 대신 이미지 인덱스가 반환됩니다.

    gcr.io/google-containers/pause:3.2 이미지의 이미지 인덱스를 가져옵니다.

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

    출력은 다음과 비슷합니다.

    {
       "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"
             }
          }
       ]
    }
    
  • 결과를 필터링하여 원하는 플랫폼에 대해 이미지 다이제스트를 추출합니다. amd64 CPU 아키텍처 및 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'
    

    이 명령어에서 필터링은 containerd와 같은 컨테이너 런타임이 이미지 인덱스의 대상 플랫폼과 일치하는 이미지를 선택하는 방식을 모방합니다.

    출력은 다음과 비슷합니다.

    sha256:4a1c4b21597c1b4415bdbecb28a3296c6b5e23ca4f9feeb599860a1dac6a0108
    

    이미지 다이제스트충돌 방지 해시를 이미지 색인이나 이미지 매니페스트(일반적으로 SHA-256 알고리즘)에 적용한 결과입니다.

  • 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
    

    출력은 다음과 비슷합니다.

    4a1c4b21597c1b4415bdbecb28a3296c6b5e23ca4f9feeb599860a1dac6a0108
    

    이미지 다이제스트 값을 다음과 같이 사용하여 이 이미지를 참조할 수 있습니다.

    gcr.io/google-containers/pause-amd64@sha256:4a1c4b21597c1b4415bdbecb28a3296c6b5e23ca4f9feeb599860a1dac6a0108
    
  • 콘텐츠 지정 가능 스토리지 개념을 사용하여 다이제스트를 참조로 사용해 이미지 매니페스트를 가져옵니다.

    curl -s https://gcr.io/v2/google-containers/pause-amd64/manifests/sha256:4a1c4b21597c1b4415bdbecb28a3296c6b5e23ca4f9feeb599860a1dac6a0108
    
  • 많은 컨테이너 이미지 레지스트리는 HTTP HEAD 요청에 대한 응답으로 Docker-Content-Digest 헤더에서 매니페스트의 다이제스트, 이미지 인덱스, 구성 객체, 파일 시스템 레이어를 반환합니다. 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
    

    출력은 다음과 비슷합니다.

    sha256:927d98197ec1141a368550822d18fa1c60bdae27b78b0c004f705f548c07814f
    

    Docker-Content-Digest 헤더는 개방형 컨테이너 이니셔티브 배포 사양에 따라 강제되지 않습니다. 따라서 이 방식이 모든 컨테이너 이미지 레지스트리에서 작동하지는 않을 수 있습니다. 이것은 Artifact RegistryContainer Registry에 사용할 수 있습니다.

  • 이미지 매니페스트의 다이제스트 값을 사용하여 이미지 구성 객체를 검색하려면 다음을 수행합니다.

    1. 구성 다이제스트를 가져옵니다.

      CONFIG_DIGEST=$(curl -s https://gcr.io/v2/google-containers/pause-amd64/manifests/3.2 \
          | jq -r '.config.digest')
      
    2. 구성 다이제스트를 사용하여 구성 객체를 검색하고 jq를 사용하여 쉽게 읽을 수 있도록 출력 형식을 지정합니다.

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

      출력은 다음과 비슷합니다.

      {
        "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"
          ]
        }
      }
      
  • 이미지 매니페스트의 다이제스트 값을 사용하여 파일 시스템 레이어를 검색하려면 다음을 수행합니다.

    1. 검색하려는 레이어의 다이제스트를 가져옵니다.

      LAYER_DIGEST=$(curl -s https://gcr.io/v2/google-containers/pause-amd64/manifests/3.2 \
          | jq -r '.layers[0].digest')
      
    2. 레이어 다이제스트를 사용하여 레이어 tar 파일을 검색하고 콘텐츠를 나열합니다.

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

      이 레이어에는 pause라는 하나의 파일만 있습니다.

  • 이미지 다이제스트와 연관된 태그를 조회하려면 다음을 수행합니다.

    1. 조회하려는 다이제스트를 정의합니다.:

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

      IMAGE_DIGEST 환경 변수에는 3.2 태그로 참조되는 이미지의 다이제스트가 포함됩니다.

    2. 이미지 태그 목록 엔드포인트/tags/list를 사용하여 태그 정보를 나열하고 다이제스트 값에 대한 태그를 추출합니다.

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

      출력은 다음과 비슷합니다.

      [
        "3.2"
      ]
      
  • cURL을 사용하여 Artifact Registry 컨테이너 이미지 저장소에서 이미지의 매니페스트를 가져오려면 Authorization 요청 헤더에 액세스 토큰을 포함하세요.

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

    다음을 바꿉니다.

    • LOCATION: 저장소의 리전 또는 멀티 리전 위치
    • PROJECT_ID: Google Cloud 프로젝트 ID
    • REPOSITORY: 저장소 이름
    • IMAGE: 이미지 이름
    • DIGEST: sha256:DIGEST_VALUE 형식의 이미지 다이제스트

다음 단계

  • 이미지에 대해 자세히 알아보려면 개방형 컨테이너 이니셔티브 이미지 형식배포 사양 참조