OS
- Chip: Apple M4
- archituecture: arm64
문제 상황
private repository 에 architecture amd64 / arm64 모든 이미지를 넣고싶다.
즉, DockerHub 에서 흔히 볼 수 있는 multiplatform image 를 빌드하고 관리하고 싶다.

MultiPlatform image 란?
여러 OS / architecture 를 지원하는 이미지라는 뜻이다.
쉽게 생각하면, 내 운영체제가 linux / amd64 라면 linux / amd64 빌드 이미지를 사용하게 되고
linux / arm64 라면 linux / arm64 이미지를 자동으로 받는다.
$ podman pull adobe/s3mock:5.0
# image
$ podman inspcect adobe/s3mock:5.0
나의 CPU Architecture 는 M4 로 arm64 므로 linux/arm64 이미지를 받았음을 확인할 수 있다.

Apple M4 칩이 아닌 Intel 칩을 사용했다면 linux/amd64 를 다운받았을 것이다.
한가지 사실을 알 수 있다.
로컬 머신의 OS, Architecture가 pull 할 이미지를 결정한다.
arm64 뿐만 아니라 amd64에서도 사용하고 싶다면 multiplatform 이미지를 빌드해야한다.
그래서 어쩌라고?
우선, multi platform 이미지를 말려면 manifest 를 생성해야한다.
(1) manifest 생성
$ podman manifest create s3mock-multiarch
(2) manifest 에 multiplatform 이미지 추가
$ podman manifest add --all s3mock-multiarch \
adobe/s3mock:5.0.0
(3) manifest 확인
$ podman manifest inspect s3mock-multiarch

os/architecture 가 unknown 2개가 생성되는데 무시해도된다.
unknown 의 정체는..
Docker BuildKit 으로 빌드된 이미지는 자동으로 Provenance attestation - "Github Action 이면 어떤 runner 에서, 어떤 commit 으로 어떤 빌드 인자로 만들어졌는가" 와 같은 메타데이터를 함께 publish한다. 이 과정에서 multi-arch 빌드면 각 플랫폼마다 하나씩 생성되므로 2개 플랫폼 (arm64 + amd64) -> 2개 attestation 이 자동생성된다.
아무튼 몰라도 된다. 별로 안중요하다.
(4) manifest push
AWS ECR 에 manifest 로 생성한 멀티플랫폼 이미지를 push 한다고 해보자.
$ podman manifest push --all s3mock-multiarch \
docker://{AWS_ACCOUNT_ID}.dkr.ecr.{AWS_REGION}.amazonaws.com/{ECR_REPOSITORY}/s3mock:5.0.0
혹시나 이 단계에서 에러가 난다면 다음과 같은 방법으로 unknown 의 os architecture digest 를 제거하고 다시 시도해보라.
Registry 에서 os/architecture 가 unknown 인 이미지를 거절하는 경우도 있다.
$ podman manifest remove <unknown-digest>
끝났다!
✅ 멀티 플랫폼 이미지를 빌드할 수 있다.
✅ 멀티 플랫폼 이미지를 pull 하면 자동으로 해당 머신의 os/architecture 에 따라 이미지를 선택하여 다운받는다.
manifest 가 뭐고 왜쓰는거지?
이게 의문일거다.
manifest 등장 배경
초기의 Docker 는 이미지 1개당 1개의 아키텍처였다.
- nginx:latest # amd64 전용
- arm64v8/nginx:latest # arm64 전용
- amd64v7/nginx:latest # armv7 전용
이러면, 지원하고자 하는 아키텍처 개수만큼 image 를 따로 빌드해야한다.
Dockerfile 의 내용은 똑같은데 이미지 개수만큼 빌드를 진행해야한다.
사용자도 매번 아키텍처별로 이미지를 구분해서 사용해야했다.
manifest 아이디어는 다음과 같다.
"하나의 태그 (nginx:latest) 로 여러 플랫폼별 이미지를 가리키는 인덱스를 가리키게 할 수 있게하자.
사용자가 pull 하면 클라이언트 플랫폼에 맞는 이미지를 알아서 골라갈 수 있도록 지원하자."
manifest 구조
adobe/s3mock:5.0.0 manifest 전체 구조를 살펴보자.

동작 순서를 요약하면.
- 사용자가
adobe/s3mock:5.0.0을 pull 한다. - Manifest List 가 반환된다.
- 클라이언트가 자기 플랫폼 (ex. arm64) 를 보고 arm64 Image Manifest digest 를 선택한다.
- 선택한 image 를 pull 받는다.
'기타 > Docker' 카테고리의 다른 글
| Docker 대신 Podman 으로 이미지 업로드 하기 (0) | 2026.01.21 |
|---|---|
| [Error] Docker Desktop - WSL integration with distro 'Ubuntu' Unexpectdly stopped. Do you want to restart it? (0) | 2025.04.17 |
| [Docker] manifest digest vs index digest (0) | 2024.10.21 |
| [Docker] Multi Stage (0) | 2024.09.20 |
| [Docker] credential (0) | 2024.08.09 |