티스토리 뷰

728x90

GraalVM을 사용한 네이티브 이미지 정적 링크 빌드란?

GraalVM 네이티브 이미지(Native Image)란?
Java 애플리케이션을 AOT(Ahead-Of-Time) 컴파일하여 **독립 실행 파일(바이너리)**로 변환하는 기술입니다.
이렇게 하면 JVM 없이 실행 가능하며, 시작 속도가 빠르고 메모리 사용량이 적습니다.

그런데 네이티브 이미지(Native Image)를 빌드하는 방법은 두 가지가 있습니다.

  1. 동적 링크(Shared Link): 실행 시 OS의 공유 라이브러리(glibc 등)를 사용
  2. 정적 링크(Static Link): 실행 파일에 필요한 모든 라이브러리를 포함 (독립적 실행 가능)

즉, "정적 링크 빌드"란?

  • OS에 의존하지 않고 실행될 수 있도록 모든 라이브러리를 실행 파일에 포함하는 방식입니다.
  • 이렇게 하면 scratch 같은 최소한의 컨테이너에서도 실행 가능합니다.

🔥 왜 정적 링크를 사용해야 할까?

 

빌드 방식  특징  실행 환경
동적 링크 (기본) OS 공유 라이브러리를 사용 glibc 또는 musl 필요
정적 링크 (Static) 실행 파일에 모든 라이브러리 포함 OS가 필요 없음 (scratch 사용 가능)

💡 즉, 정적 링크 빌드는 "완전 독립적인 실행 파일"을 만들기 위해 필요합니다!


🚀 GraalVM을 사용한 정적 링크 네이티브 이미지 빌드

📌 실행 방법: -Dorg.graalvm.nativeimage.imagecode=static 옵션 추가

Dockerfile에서 Gradle을 사용하여 정적 링크 네이티브 이미지를 빌드하는 과정입니다.

# Step 1: GraalVM을 사용한 정적 링크 네이티브 이미지 빌드
FROM ghcr.io/graalvm/graalvm-ce:alpine AS builder
WORKDIR /app

# 필수 패키지 설치
RUN apk add --no-cache bash curl gcc musl-dev zlib-dev

# 프로젝트 파일 복사
COPY . .
RUN chmod +x ./gradlew

# 네이티브 이미지 빌드 (완전 정적 링크)
RUN ./gradlew nativeCompile \
    -Dorg.graalvm.nativeimage.imagecode=static \  # ✅ 정적 링크 옵션 추가
    --no-daemon \
    -Pnative

🛠 정적 링크 vs 동적 링크 예제 비교

🚫 동적 링크 실행 파일 (imagecode=dynamic)

$ ldd application
linux-vdso.so.1 (0x00007ffc1092f000)
libc.so.6 => /lib64/libc.so.6 (0x00007fbcf27f4000)

동적 링크 방식이므로 libc.so.6 같은 OS 라이브러리가 필요합니다.


✅ 정적 링크 실행 파일 (imagecode=static)

$ ldd application
not a dynamic executable  # ✅ 모든 라이브러리가 포함되어 있음!

OS 없이도 실행 가능 (scratch 컨테이너에서도 실행 가능)


🔥 최종 결론:

  • GraalVM 네이티브 이미지는 기본적으로 동적 링크 방식으로 빌드됨
  • 하지만, 최소한의 리소스로 실행하려면 "정적 링크 빌드"가 필요
  • -Dorg.graalvm.nativeimage.imagecode=static 옵션을 추가하면 OS 없이 실행 가능한 독립 실행 파일 생성
  • 정적 링크 빌드를 사용하면 scratch 컨테이너에서 최적의 실행 환경을 만들 수 있음! 🚀
728x90
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함