linux/amd64, linux/arm64 두 플랫폼 이미지를 arm64 러너 한 대에서 QEMU 에뮬레이션 없이 빌드한다.
핵심 전략: 빌드 스테이지는 항상 호스트 플랫폼(arm64)에서 네이티브 실행하고, 런타임 스테이지에서 RUN을 제거하여 에뮬레이션 없이 멀티플랫폼 이미지를 조립한다.
| 파일 | 역할 |
|---|---|
Dockerfile |
메인 빌드 (frontend → backend → runtime) |
Dockerfile.runtime-base |
runtime base 이미지 (curl, jq 사전 설치) |
.github/workflows/docker.yml |
메인 이미지 빌드/push CI |
.github/workflows/runtime-base.yml |
runtime base 이미지 빌드/push CI |
┌─────────────────────────────────────────────────────┐
│ frontend --platform=$BUILDPLATFORM (항상 arm64) │
│ node:22-slim → pnpm build → static files │
└──────────────────────┬──────────────────────────────┘
│
┌──────────────────────▼──────────────────────────────┐
│ backend --platform=$BUILDPLATFORM (항상 arm64) │
│ amazoncorretto:25-alpine → gradle bootJar → *.jar │
└──────────────────────┬──────────────────────────────┘
│ COPY *.jar
┌──────────────────────▼──────────────────────────────┐
│ runtime ($TARGETPLATFORM — amd64 또는 arm64) │
│ deck-runtime-base:latest │
│ COPY app.jar ← RUN 없음, 에뮬레이션 불필요 │
└─────────────────────────────────────────────────────┘
$BUILDPLATFORM / $TARGETPLATFORM 은 docker buildx build --platform 실행 시 BuildKit이 자동으로 주입하는 ARG다.
deck-runtime-base:latest = amazoncorretto:25-alpine + curl + jq
- Harbor:
ireg.querypie.io/ci/deck-runtime-base:latest Dockerfile.runtime-base변경 시runtime-base.yml워크플로우가 자동 재빌드한다.- 수동 빌드/push가 필요한 경우:
docker buildx build \ --platform linux/amd64,linux/arm64 \ -f Dockerfile.runtime-base \ -t ireg.querypie.io/ci/deck-runtime-base:latest \ --push .
두 파일을 반드시 동시에 수정한다.
| 파일 | 수정 위치 |
|---|---|
Dockerfile |
backend 스테이지 FROM --platform=$BUILDPLATFORM ... amazoncorretto:X-alpine |
Dockerfile.runtime-base |
FROM ... amazoncorretto:X-alpine |
수정 후 runtime-base.yml 워크플로우가 자동 실행되어 base 이미지를 재빌드한다.
메인 빌드 실행 전에 base 이미지가 Harbor에 있어야 한다.
Actions → CI / Runtime Base Image → Run workflow (develop 브랜치)
- 트리거:
Dockerfile.runtime-base변경 push (develop, release) 또는 수동 - 러너:
["os:ubuntu", "arch:arm64", "purpose:build"] - QEMU 사용: ✅ (base 이미지 빌드는
RUN apk add실행 필요) - 출력:
ireg.querypie.io/ci/deck-runtime-base:latest(multi-arch manifest)
- 트리거: PR/push (develop, release) 또는 수동
- 러너:
["os:ubuntu", "arch:arm64", "purpose:build"] - QEMU 사용: ❌ (런타임 스테이지에
RUN없음) - 출력:
ireg.querypie.io/ci/deck-{service}:{tag}(multi-arch manifest)