Zettelkasten

Docker Buildx provenance는 이미지를 OCI Index로 만들어 SageMaker와 Lambda에서 깨진다

·수정 2026.05.04·수정 1

요약

  • Provenance는 이미지의 빌드 출처(소스, 빌더, 입력, 시각)를 기록하는 SLSA 공급망 보안 메타데이터.
  • Buildx v0.10+부터 기본 활성화되어 이미지를 단일 manifest가 아닌 OCI Image Index 형식으로 푸시한다.
  • SageMaker/Lambda는 OCI Index를 못 읽기 때문에 Unsupported manifest media type application/vnd.oci.image.index.v1+json 에러가 발생 — provenance: false로 꺼야 한다.

본문

Provenance란

이미지의 "출처 증명서". 이미지가 언제, 어디서, 무엇으로, 어떻게 빌드되었는지를 기록한 메타데이터.

기록되는 항목:

  • 소스: 어떤 Git 저장소의 어떤 커밋에서 빌드됐는지
  • 빌더: BuildKit 버전, 빌드 머신(GitHub Actions runner 등)
  • 입력: base image, build args, 환경변수
  • 빌드 명령: Dockerfile의 어떤 instruction이 실행됐는지
  • 시각: 빌드 시작/종료 시간

왜 만들어졌나 — SLSA

소프트웨어 공급망 공격(SolarWinds, npm 악성 패키지 등)을 막기 위해 Google이 주도한 SLSA (Supply-chain Levels for Software Artifacts) 프레임워크의 일부. "이 바이너리가 정말 우리가 의도한 소스에서 나온 것인가?"를 검증할 수 있게 함.

무엇이 문제인가 — OCI Image Index

Buildx v0.10부터 provenance attestation이 자동으로 첨부되며, 이미지가 단일 manifest가 아니라 OCI Image Index 형식으로 푸시된다.

provenance: true (Buildx v0.10+ 기본값) — OCI Index

sha256:xxx (OCI Image Index)
├── sha256:aaa (linux/amd64 이미지)
├── sha256:bbb (provenance attestation, JSON)
└── sha256:ccc (SBOM attestation)

provenance: false — 단일 Docker manifest

sha256:xxx (Docker manifest v2)
└── (단일 이미지)

호환성 매트릭스

형식 Media Type SageMaker Lambda ECS/Fargate K8s
OCI Index application/vnd.oci.image.index.v1+json
Docker v2 application/vnd.docker.distribution.manifest.v2+json

증상 (SageMaker):

Unsupported manifest media type application/vnd.oci.image.index.v1+json for image

해결: provenance: false

docker/build-push-action에서 명시적으로 끄기:

- name: Build and push image
  uses: docker/build-push-action@v5
  with:
    context: ${{ inputs.context }}
    push: true
    tags: ${{ steps.tags.outputs.full-tags }}
    provenance: false  # SageMaker/Lambda 호환을 위해

CLI로 직접 빌드하는 경우:

docker buildx build --provenance=false --push -t my-image:latest .

검증 방법

# 이미지에 붙은 provenance 확인
docker buildx imagetools inspect my-image:latest --format '{{ json .Provenance }}'

# 매니페스트 형식 확인
docker buildx imagetools inspect my-image:latest --raw

서명까지 추가하려면 cosign으로 in-toto attestation 서명/검증.

트레이드오프

측면 의미
목적 공급망 보안 (이 이미지를 믿어도 되는가?)
비용 이미지가 OCI Index 형식 → 일부 런타임이 못 읽음
선택 OCI Index 지원 환경(ECS/K8s) → 켜두기 / SageMaker·Lambda 배포 → 끄기

참고