스터디/Etc

Docker 이미지 멀티플 아키텍처로 만들기 (멀티 플랫폼 빌드)

Dalmangyi 2023. 7. 20.

M1 Macbook Pro로 만들땐 매우 조심해야합니다...

 

docker(이하, 도커) 이미지를 만들때는 만드는 환경을 반영해서 이미지를 만듭니다.

인텔 환경에서 만들면 x86, x64 아키텍처가 반영되고, AMD환경에선 linux/amd64, 애플칩에서 만들면 limux/arm/v7가 반영됩니다.

 

만드는건 상관없지만 실행하는 서버에서는 arm64가 아닌 서버마다 세팅해놓은 아키텍처로 실행되기 때문에 

도커가 정상적으로 실행되지 않을 수 있습니다.

 

서버측에선 주로 이런 에러가 출력됩니다.

exec user process caused “exec format error”

 

 

 

Buildx

19버전 부터 지원하는 CLI 플러그인을 이용해서 빌드옵션을 설정할 수 있습니다.

 

 

아키텍처 목록 확인

$ docker buildx ls

 

빌더 변경

멀티플 플랫폼을 도커 이미지에 적용하기 위해선 기존과 다른 빌더가 필요합니다.

어려운건 아니고 아래 명령어를 입력해서 buildx용 빌더를 만들어서 지금 사용중인 빌더랑 교체하면 됩니다.

$ docker buildx create --name muiltiple-platforms-builder --use

 

빌더 확인

지금 사용중인 빌더가 뭔지 확인 할 수 있습니다.

확인하는 과정에 최초 확인이면 빌더 생성과정이 포함되어 있습니다.

$ docker buildx inspect --bootstrap

서버 머신이 어떤 플랫폼인지 정확히 아는 명령어는 없기 때문에, 각 서버를 확인하는게 좋을듯 싶습니다.

 

 

 

 

 

이미지 빌드 (기존)

$ docker build . -t <docker-hub-id>/<image-name>

 

buildx 옵션

1) --load

load는 도커 이미지를 추출하는 것이고, 이 옵션은 멀티플랫폼은 적용이 안됩니다. 1개의 platfrom만 선택하면 가능합니다.

load할때는  $ docker manifest  커맨드가 사용되기 때문에, 도커의 설정을 변경해야 합니다.

$ vi ~/docker/config.json

# 아래 내용중 experimental 키-밸류를 추가.
{
    ...
    "experimental": "enabled",
    ...
}

 

2) --push

push는 docker-hub에 바로 업로드하는 것입니다.

멀티플랫폼 이미지는 추출이 불가하고, docker-hub에 밖에 못 올립니다.

 

 

 

이미지 빌드 (buildx 이용)

$ docker buildx build --load . --platform=linux/amd64 -t <docker-hub-id>/<image-name>
$ docker buildx build --push . --platform=linux/arm64,linux/amd64 -t <docker-hub-id>/<image-name>

멀티플랫폼 옵션을 쓰기위해선 결국 push만 사용하게 됩니다.

docker hub에서 Tags탭으로 들어가서 이미지 보면, 한 이미지에 2개의 아키텍처가 올라온걸 볼 수 있습니다.

 

 

 

 

 

마치며

어쩌다가 이번에 새로 써보는 saas 덕분에 마주하게 되었습니다.....

docker가 워낙 편하다보니.. 다른 플랫폼은 dockerfile만 참고해서 알아서 해줄줄 알았는데..

역시 알아서 되는건 없나봅니다 

 

이걸 읽으신 개발자님들.... 저 처럼 삽질하다가 여기까지 오셨을텐데.... 화이팅!.....

 

 

댓글