Docker : exec /usr/bin/sh: exec format error
최근 진행중인 프로젝트의 서버를 배포하는 과정에서 생긴 이슈이다.
상황
- m1 맥북에서 Spring 이미지를 빌드했다.
- 내 dockerhub 레지스트리로 푸시했다.
- 우분투 리눅스 서버에서 내가 만든 이미지를 받아서 컨테이너로 실행했다.
- ! 에러 !
도커 컨테이너를 실행하면 내가 지정해준 entrypoint -> command 순으로 명령어가 실행된다.
그런데 명령어 실행이 전혀 안되고 위와 같은 에러만 내뿜었다.
Dockerfile의 CMD나 docker-compose 파일의 entrypoint를 수정해봤지만 여전히 같은 에러가 났다.
문제점
m1 맥북은 ARM 아키텍처를 사용한다.
그래서 m1에서 도커 이미지를 빌드하면 arm64/v8 기반 플랫폼에서 사용할 수 있도록 이미지가 빌드된다.
Linux는 arm이 아니라 amd64 기반 아키텍처니까..
빌드된 이미지의 실행환경이 달라서 명령어를 수행하지 못한 것이다.
해결
도커는 멀티 플랫폼 빌드 라는 기능을 지원한다.
바로 buildx
라는 툴을 사용해서 해결 가능하다.
특이 사항
- docker 19.03 미만 버전에서는 사용이 불가능하다.
- docker buildx 는 다양한 플랫폼에 대한 이미지 빌드를 지원한다.
- 별도의 Dockerfile 작성이 필요없다.
- 도커 데스크탑 버전에 따라 experimental features 를 활성화 할지가 결정된다.
(최소 4.4.2 이후로는 따로 설정 안해도 됨)
도커 Version 확인
docker --version
멀티 플랫폼 이미지 빌드(amd64 리눅스 대상)
docker buildx build --platform linux/amd64 -t <이미지명:태그> .
중요한 키워드는 buildx
와 --platform
이다.
빌드를 호출할 때 --platform플래그를 설정하여 빌드의 대상 플랫폼을 지정할 수 있다.
ex: linux/amd64, linux/arm64, 또는 darwin/amd64
'DevOps > Docker' 카테고리의 다른 글
[Docker] 이미지와 레이어(layer) 구조 (0) | 2022.01.25 |
---|---|
[Docker] 컨테이너 기능별, 포트별 분리 (feat. nginx) (0) | 2021.11.22 |
[Docker] certbot 컨테이너를 사용해 SSL 인증서 발급받기 (0) | 2021.11.14 |
[Docker] Docker Swarm 서비스하기 (0) | 2021.08.24 |
[Docker] Docker Swarm에 대해서 (0) | 2021.08.18 |