Skip to content

Latest commit

 

History

History
100 lines (71 loc) · 4.09 KB

File metadata and controls

100 lines (71 loc) · 4.09 KB

Multi-Platform Docker 빌드

개요

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

Dockerfile 스테이지 구조

┌─────────────────────────────────────────────────────┐
│ 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 / $TARGETPLATFORMdocker buildx build --platform 실행 시 BuildKit이 자동으로 주입하는 ARG다.


Runtime Base 이미지

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 .

유지보수

amazoncorretto 버전 업그레이드 시

두 파일을 반드시 동시에 수정한다.

파일 수정 위치
Dockerfile backend 스테이지 FROM --platform=$BUILDPLATFORM ... amazoncorretto:X-alpine
Dockerfile.runtime-base FROM ... amazoncorretto:X-alpine

수정 후 runtime-base.yml 워크플로우가 자동 실행되어 base 이미지를 재빌드한다.

처음 배포 시 (runtime-base 미존재)

메인 빌드 실행 전에 base 이미지가 Harbor에 있어야 한다.

Actions → CI / Runtime Base Image → Run workflow (develop 브랜치)

CI 동작

runtime-base.yml

  • 트리거: 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)

docker.yml

  • 트리거: PR/push (develop, release) 또는 수동
  • 러너: ["os:ubuntu", "arch:arm64", "purpose:build"]
  • QEMU 사용: ❌ (런타임 스테이지에 RUN 없음)
  • 출력: ireg.querypie.io/ci/deck-{service}:{tag} (multi-arch manifest)