Dockerfile 내 FROM openjdk:17-jdk-alpine 실패

이리·2025년 6월 29일
0

Trouble Shooting

목록 보기
1/5
post-thumbnail

MacBook M1를 들고 docker build를 진행하며 생긴 문제에 대해 기록하려합니다! 간단한 문제니 간단하게 해결해보자구요!


문제상황

Dockerfile을 사용해서 jar 파일을 이미지로 생성하려고 했지만 Dockerfile 스크립트 내의 FROM openjdk:17-jdk-alpine as stage1이 문제가 되어 정상적인 이미지 생성이 불가한 문제였습니다.

ERROR: failed to solve: openjdk:17-jdk-alpine: failed to resolve source metadata for docker.io/library/openjdk:17-jdk-alpine: no match for platform in manifest: not found

자체진단

  • openjdk:17-jdk-alpineeclipse-temurin:17-jdk-alpine 이미지는 ARM64(M1/M2) 아키텍처에 맞는 Alpine 태그를 제공하지 않기 때문에 m1 환경에서는 에러가 발생한 것이었습니다.

    두 이미지 모두 x86_64 (Intel/AMD)만 지원하기 때문이죠.

    이를 해결하기 위해 ARM64를 지원하는 Linux 기반 Java 이미지인 eclipse-temurin:17-jdk로 변경하였고, 해당 환경에서는 문제없이 jar 이미지 생성이 가능했습니다.


배운점

문제는 간단하게 FROM eclipse-temurin:17-jdk로 바꾸는 것으로 해결할 수 있었지만,
한 가지 의문이 생겼습니다.


Docker는 어떤 OS든지 똑같이 실행환경을 보장하는 것이 장점이라 했는데, 왜 내 M1에서는 특정 이미지가 작동하지 않았는지 이해가 되지 않았습니다.


그에 대한 제가 찾은 답변입니다 :)


Docker는 운영체제에는 독립적이지만, CPU 아키텍처에는 종속적입니다.

즉, windows, mac, Linux 모두 Docker를 사용할 수 있지만 그 내부에서 사용하는 이미지는 해당 시스템의 CPU 종류와 맞아야합니다!

Docker인데 왜 내 CPU 아키텍처에 의존적일까?

도커 이미지는 운영환경과 실행 가능한 프로그램이 포함된 패키지입니다.


도커 이미지 내부에는

  • 리눅스 사용자 공간: 쉘, 명령어 유틸리티
  • 런타임 바이너리: 언어 실행기
  • 파일 시스템 계층: 실제 프로그램 파일

하지만 이들은 모두 기계어로 컴파일된 바이너리 파일로 각각은 특정 CPU 아키텍처의 명령어 집합에 맞춰 만들어집니다.


즉, 이미지가 x86 아키텍처용으로 컴파일 되었다면, ARM64 아키텍처의 CPU는 그 명령어를 해석할 수 없기 때문에 해당 이미지를 실행할 수 없게 되는거죠!


물론, 대안으로 에뮬레이션을 활용하는 방법이 있지만 이것은 성능저하가 크기때문에 권장하지 않는 방법이라고 합니다.


따라서 설치하려는 이미지가 지원하는 CPU 아키텍처가 무엇인지를 확인하는것이 중요합니다.


Docker.. 알고 씁시다.. 😓

0개의 댓글