Docker exec user process caused "exec format error" 에러 해결 방법

안녕하십니까. 

AWS에 Docker를 통해서 클러스터를 구축하는 도중 에러가 발생하였습니다.

이에 관한 포스팅을 하려고 합니다.

에러 상황

CodeBuild에서 Dockerfile을 통해 이미지를 생성하는 도중 다음과 같은 에러가 발생하였습니다. 그리고 이미지가 빌드가 되지 않습니다.

exec user process caused "exec format error"
같은 Dockerfile을 통해서 제 컴퓨터에서 docker build를 하니 에러가 발생하지 않고 잘 동작 합니다. 구글링을 해보니 아키텍쳐가 다르면 나올 수 있다고 합니다. 아래 명령어를 통해서 아키텍쳐를 확인해 봅니다.

(base) myeongjoon@myeongjoon-B365M-D3H:~/.ssh$ uname -m
x86_64
 
제 컴퓨터는 x86_64라고 되어 있습니다. 사용하는 ECS의 architecture를 확인해보니 aarch64라고 합니다. 이는 x86와는 다른 아키텍쳐이고 arm64계열 입니다. 
host 운영체제와 해당 운영체에 위에서 돌아가는 docker container의 아키텍쳐 계열이 맞아야 정상적으로 명령어가 실행 된다고 합니다. 

에러 해결 방안 1 호스트 - 이미지 아키텍쳐 통일

해결 방안 1은 간단 합니다. 호스트에서 사용하는 이미지와 도커 이미지 상의 아키텍쳐를 통일하는 것 입니다. 

예를 들어서 다음과 같이 AWS CodeBuild에서 사용하는 host의 architecture를 설정할 수 있습니다.
현시각 기준 서울은 x86만 지원하는 단점이 있습니다. 

이미지의 아키텍처를 확인하는 방법은 다음과 같습니다.
  • 이미지의 태그 확인 
    • 예를 들어서 태그에서 아키텍쳐에 따른 이미지를 관리하는 경우가 있습니다. 
  • 이미지의 상위 이미지를 확인하기
    • 각 이미지는 dockerfile을 가지고 있고, 이때 상위 이미지를 거슬러 올라가다 보면 맨 처음 이미지를 확인 할 수 있습니다.

에러 해결 방안 2 Dockerfile 직접 생성

위의 해결 방안 1의 단점이 있는데, 예를 들어서 아마존에서는 arm64만 지원하지만, 해당 이미지는 x86 기반으로 작성되어 있을 경우 이미지를 사용할 수 없게 됩니다. 또한 사용하는 이미지에서 arm64를 지원하지 않아서 이미지를 그대로 사용할 수 있는 방법이 없었습니다. 따라서 이 경우 직접 arm64로 빌드 해야합니다. 저는 여기서 arm64v8/ubuntu:16.04 이미지를 사용하였습니다. 

방법은 간단합니다. docker hub 사이트에서 내가 사용할 이미지의 상위 이미지들의 코드를 전부 가져와서 최상위 이미지만 변경 하였습니다. 여기서 약간 문제가 될 수 있는건, 명령어에서 약간 에러가 발생 할 수 있으나, 이는 빌드해보면서 처리하면 됩니다. 

예를 들어 봅시다. 제가 사용했던 이미지는 selenium/standalone-firefox 입니다. 이 이미지의 상위 이미지는 selenium/node-firefox:3.5.3-boron, selenium/node-base:3.5.3-boron, selenium/base:3.5.3-boron, ubuntu:16.04 입니다. 모든 dockerfile을 순서대로 붙인 후 마지막 이미지만 arm64v8/ubuntu:16.04로 변경하였습니다. 

댓글

이 블로그의 인기 게시물

고려대학교 야간대학원 중간 후기

포켓몬 고 17셀 확인 포고맵 사용 방법

HTTP 오류 500.19 - Internal Server Error 에러 처리법