
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-alpine와 eclipse-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 종류와 맞아야합니다!
도커 이미지는 운영환경과 실행 가능한 프로그램이 포함된 패키지입니다.
도커 이미지 내부에는
하지만 이들은 모두 기계어로 컴파일된 바이너리 파일로 각각은 특정 CPU 아키텍처의 명령어 집합에 맞춰 만들어집니다.
즉, 이미지가 x86 아키텍처용으로 컴파일 되었다면, ARM64 아키텍처의 CPU는 그 명령어를 해석할 수 없기 때문에 해당 이미지를 실행할 수 없게 되는거죠!
물론, 대안으로 에뮬레이션을 활용하는 방법이 있지만 이것은 성능저하가 크기때문에 권장하지 않는 방법이라고 합니다.
따라서 설치하려는 이미지가 지원하는 CPU 아키텍처가 무엇인지를 확인하는것이 중요합니다.
Docker.. 알고 씁시다.. 😓