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만 참고해서 알아서 해줄줄 알았는데..
역시 알아서 되는건 없나봅니다
이걸 읽으신 개발자님들.... 저 처럼 삽질하다가 여기까지 오셨을텐데.... 화이팅!.....
'스터디 > Etc' 카테고리의 다른 글
NPM install product, dev (0) | 2023.08.01 |
---|---|
[Strapi4] 처음부터 적용까지 (0) | 2023.07.25 |
Nodejs 버전관리 (버전 변경, 다운그레이드, 업그레이드) (0) | 2023.07.03 |
강아지 혈류량으로 맥박수, 산소포화도, 호흡수 구하기 (스압) (4) | 2023.06.07 |
React CORS Proxy 세팅오류 - 사이트 연결할 수 없음. (0) | 2023.04.06 |
댓글