지난 포스팅 [혼자 공부하는 도커] 도커를 이용해 EC2 서버에 배포하기 에서 Apple M1 의 경우 Docker 이미지의 빌드 호환성 문제가 있어서, 이를 해결하기 위한 방법을 간단히나마 알려드렸습니다. 그런데 왜 호환성 문제가 발생하는 것인지에 대해 이번에 더 자세히 다루고자 합니다.
분명 로컬에서 생성한 도커 이미지를 실행시켰을 때는 정상적으로 실행되었습니다. 따라서 클라우드 서버에서도 pull 받은 도커 이미지를 빌드하고 실행시켰을 때 문제가 당연히 없을 것이라 생각했습니다.
그러나 docker run 을 했을때 아래와 같은 호환성 에러 메시지를 발견했고, 정상적으로 서버가 실헹되지 않았습니다.
WARNING: The requested image's platform (linux/arm64/v8) does not match the detected host platform (linux/amd64) and no specific platform was requested standard_init_linux.go:228: exec user process caused: exec format error
에러 메시지를 읽어보니 호환성 문제였습니다. 현재 제가 쓰고있는 맥북이 Apple M1칩인데, 도커가 해당 이미지를 빌드할때 생성된 빌드 플랫폼이 ec2서버와 m1 맥북간의 호환성이 안맞는 문제였습니다.
핵심부터 말씀드리자면 Docker Image 를 빌드할 때 아래 문장을 신경써서 플랫폼을 맞춰주면 됩니다.
--platform linux/amd64
docker build --platform linux/amd64 -t msung99/maestro:0.1.0 .
위와 같이 로컬에서 다시 도커 이미지를 빌드해서, 클라우드 서버와 호환성을 맞춰주시면 돱니다. 즉, linux/amd64 로 빌드하고 클라우드 서버에 다시 run 시킨다면 문제없이 정상 실행됩니다.
또한 당연할 말이지만, 로컬에서 방금 호환성 문제를 해결하기 위해 만든 이미지를 run 시킨다면 정상 실행되지 않을겁니다. 클라우드 서버에 맞춰서 도커 이미지를 빌드한 것이기 때문에, 로컬의 m1 칩 환경에서는 실행되지 않는것이 정상입니다.