[Docker] multiplatfom 이미지 빌드하고 푸시하기

2026. 5. 15. 18:21·기타/Docker

OS

  • Chip: Apple M4
  • archituecture: arm64

문제 상황

private repository 에 architecture amd64 / arm64 모든 이미지를 넣고싶다.
즉, DockerHub 에서 흔히 볼 수 있는 multiplatform image 를 빌드하고 관리하고 싶다.

 

DockerHub adobe/s3mock MultiPlatform

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 이미지를 받았음을 확인할 수 있다.

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 전체 구조를 살펴보자.

동작 순서를 요약하면.

  1. 사용자가 adobe/s3mock:5.0.0 을 pull 한다.
  2. Manifest List 가 반환된다.
  3. 클라이언트가 자기 플랫폼 (ex. arm64) 를 보고 arm64 Image Manifest digest 를 선택한다.
  4. 선택한 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
'기타/Docker' 카테고리의 다른 글
  • Docker 대신 Podman 으로 이미지 업로드 하기
  • [Error] Docker Desktop - WSL integration with distro 'Ubuntu' Unexpectdly stopped. Do you want to restart it?
  • [Docker] manifest digest vs index digest
  • [Docker] Multi Stage
M_Falcon
M_Falcon
  • M_Falcon
    Falcon
    M_Falcon
  • 전체
    오늘
    어제
    • 분류 전체보기 (434)
      • Web (16)
        • Nodejs (14)
        • Javascript (23)
        • FrontEnd (4)
      • DataBase (39)
        • Fundamental (1)
        • Redis (4)
        • PostgreSQL (10)
        • NoSQL (4)
        • MySQL (9)
        • MSSQL (3)
        • Error (4)
      • Algorithm (79)
        • Algorithm (문제풀이) (56)
        • Algorithm (이론) (23)
      • JVM (65)
        • Spring (13)
        • JPA (5)
        • Kotlin (13)
        • Java (24)
        • Error (7)
      • 기타 (71)
        • Kafka (3)
        • Kubernetes (3)
        • Docker (14)
        • git (19)
        • 잡동사니 (27)
      • 재테크 (11)
        • 세무 (4)
        • 투자 (3)
        • 보험 (0)
      • BlockChain (2)
        • BitCoin (0)
      • C (32)
        • C (10)
        • C++ (17)
        • Error (3)
      • Low Level (8)
        • OS (3)
        • 시스템 보안 (5)
      • 네트워크 (3)
      • LINUX (31)
        • Linux (27)
        • Error (4)
      • 저작권과 스마트폰의 이해 (0)
      • 생각 뭉치 (6)
      • 궁금증 (2)
      • Private (4)
        • 이직 경험 (0)
        • 꿈을 찾아서 (1)
      • Android (21)
        • OS (4)
  • 블로그 메뉴

    • 홈
    • WEB
    • 알고리즘
    • DataBase
    • Linux
    • Mobile
    • C
    • 방명록
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    docker
    Spring
    algorithm
    javascript
    android
    ubuntu
    java
    database
    알고리즘
    PostgreSQL
    linux
    JPA
    C++
    프로그래머스
    Kotlin
    Bitcoin
    Programmers
    kafka
    Git
    백준
  • hELLO· Designed By정상우.v4.10.3
M_Falcon
[Docker] multiplatfom 이미지 빌드하고 푸시하기
상단으로

티스토리툴바