문서의 선택한 두 판 사이의 차이를 보여줍니다.
— |
docker-buildx [2021/04/13 11:46] (현재) gsjung 만듦 |
||
---|---|---|---|
줄 1: | 줄 1: | ||
+ | < | ||
+ | [[https:// | ||
+ | |||
+ | 올해 4월경, 라즈베리파이(ARM 머신)에서 돌아갈 프로그램을 완성하고 Dockerfile도 모두 작성해서 빌드하고 두근두근하며 테스트용 라즈베리파이에서 실행시켜봤습니다. | ||
+ | |||
+ | 그랬더니 다음과 같은 난감한 에러만이 저를 반겨줬습니다… | ||
+ | |||
+ | > standardinitlinux.go: | ||
+ | |||
+ | 열심히 구글링을 해보니 여러 문제가 있지만 (인코딩, CRLF 포맷 등) 빌드한 시스템의 CPU 아키텍처와 실행할 시스템의 CPU 아키텍처가 다를 때에도 저 에러메시지가 뜬다는군요. | ||
+ | |||
+ | 제가 개발한 시스템은 맥북프로 13인치(2019형)였고, | ||
+ | |||
+ | `how to build docker image for arm`로 검색을 해보면 docker 공식 블로그 글이 나옵니다. | ||
+ | |||
+ | - [Building Multi-Arch Images for Arm and x86 with Docker Desktop](https:// | ||
+ | - [Getting started with Docker for Arm on Linux](https:// | ||
+ | |||
+ | 다행히도 희귀한 케이스가 아니라 공식 블로그에서도 가이드를 제공해주는 내용이기 때문에 차근차근 따라해보기로 했습니다. | ||
+ | |||
+ | ## Docker buildx | ||
+ | |||
+ | [https:// | ||
+ | |||
+ | 여러 builder를 사용할 수 있게 해주는 [Buildkit](https:// | ||
+ | |||
+ | ## 로컬에서 빌드해보기 | ||
+ | |||
+ | 일단 Experimental feature이기 때문에 별도로 enable 시켜줘야합니다. | ||
+ | |||
+ | ![https:// | ||
+ | |||
+ | macOS Docker desktop에서는 이런 식으로 활성화시켰습니다. | ||
+ | |||
+ | 그리고 다음과 같이 새로운 buildx를 생성& | ||
+ | |||
+ | ``` | ||
+ | $ docker buildx create --use --name mybuilder | ||
+ | mybuilder | ||
+ | $ docker buildx build --platform linux/ | ||
+ | ``` | ||
+ | |||
+ | 그리고 빌드한 결과물을 테스트 머신에서 돌려보니 성공적으로 동작했습니다! 야호! 이제 CI에서 동작하도록 설정해주면 됩니다. | ||
+ | |||
+ | 검색을 해보니 한 [Stackoverflow 답변](https:// | ||
+ | |||
+ | ``` | ||
+ | buildx: | ||
+ | image: docker: | ||
+ | stage: buildx | ||
+ | variables: | ||
+ | GIT_STRATEGY: | ||
+ | artifacts: | ||
+ | paths: | ||
+ | - buildx | ||
+ | expire_in: 1 hour | ||
+ | services: | ||
+ | - docker: | ||
+ | script: | ||
+ | - export DOCKER_BUILDKIT=1 | ||
+ | - git clone git:// | ||
+ | - docker build --platform=local -o . ./ | ||
+ | |||
+ | deploy: | ||
+ | image: docker: | ||
+ | stage: deploy | ||
+ | services: | ||
+ | - name: docker: | ||
+ | command: [" | ||
+ | before_script: | ||
+ | - mkdir -p ~/ | ||
+ | - mv buildx ~/ | ||
+ | - docker run --rm --privileged multiarch/ | ||
+ | script: | ||
+ | - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY | ||
+ | - docker buildx create --use --name mybuilder | ||
+ | - docker buildx build --platform linux/ | ||
+ | ``` | ||
+ | |||
+ | docker buildx를 빌드해서 Artifact로 올려서 build할 때 복사해 사용하는 방식입니다. | ||
+ | |||
+ | 뒤늦게 찾은 방법인데, | ||
+ | |||
+ | 위 방법을 사용해서 Gitlab CI에서 잘 빌드중입니다. | ||
+ | |||
+ | 뭔가 Docker에 대해 막연히 system-independent하다는 인식이 있었는데 이런 부분에 대해서 문제를 겪게 되어서 docker의 구조라든지, | ||
+ | |||
+ | - 왜 Docker는 multi-architecture support가 필요한가? |