qemu를 사용하지 않고 다중 아치 Docker 이미지 빌드

최근에 MRML , Catapulte , Jolimail 으로 Rust를 많이 해봤는데, Rust의 문제점 중 하나는 컴파일 과정이 상당히 느리다는 것입니다. 게다가 애플리케이션이 오픈 소스이고 어디에서나 작동해야 하기 때문에 amd64, i386, arm64 및 arm32v7용으로 빌드하려는 경우 빌드하기가 약간 까다로워집니다.

솔직히 말해서 처음에는 여러 아키텍처에 대해 docker와 Qemu를 사용하여 빌드하려고 시도했지만 완료했습니다with some weird errors.

Docker의 이전 동료와 약간의 채팅을 한 후 크로스 컴파일을 시도하도록 권장되었습니다. 크로스 컴파일은 시스템에 대한 lib 종속성이 없을 때 정말 좋습니다. 하지만 CatapulteJolimailactix 기반으로 하고 있는데, 이는 아키텍처용으로 컴파일 되어야 하는 OpenSSL에 의존한다. 간단히 말해서, Rust 코드를 크로스 컴파일하려면 먼저 OpenSSL을 크로스 컴파일해야 합니다. 다른 라이브러리가 있으면 크로스 컴파일하십시오.

그래서 Jolimail 에 대해 수행했지만 크로스 컴파일이지만 여러 가지 이유로 이 접근 방식이 마음에 들지 않습니다. 먼저 OpenSSL 빌드를 처리해야 합니다. 새 버전이 있으면 이미지를 다시 빌드할 뿐만 아니라 모든 것을 업데이트해야 합니다. 그런 다음 내 Dockerfile에 원치 않는 복잡성을 추가합니다. 그래서 나는 이것을 할 다른 방법을 찾기로 결정했습니다.

docker slack 커뮤니티(Billy)의 훌륭한 사용자로부터 약간의 파고와 좋은 힌트를 얻은 후 마침내 docker buildx create --append 를 처음으로 사용했습니다. docker buildx 및 다중 아치 이미지에 익숙하지 않은 경우 Docker에 있을 때 the article I wrote 을 살펴보는 것이 좋습니다.

amd64 시스템에 있고 다중 아치 이미지를 만들려는 경우 초기buildx 솔루션은 Qemu를 사용하여 대상 환경을 에뮬레이트하는 것입니다. 그러나 buildx 컨텍스트를 생성할 때 특정 플랫폼에 대한 컨텍스트 대상을 지정할 수도 있습니다.

많은 동료들과 마찬가지로 라즈베리 파이의 모든 버전을 구입했으며 각 버전도 여러 개 가지고 있지만 제대로 사용할 시간이 없습니다. 그래서 나는 하나를 시작하고(3b+ 추측) 그것에 설치했습니다HypriotOS. 그런 다음 로컬 컴퓨터에서 라즈베리 파이를 빌드할 수 있도록 context을 만들었습니다.

docker context create rpi --docker "host=ssh://pirate@black-pearl"

이 작업이 완료되면 DOCKER_CONTEXT=rpi docker pull jdrouet/kaamelott-quote 를 수행하여 라즈베리 파이를 대상으로 지정할 수 있습니다.

그런 다음 트릭은 buildx 에 대한 이미지를 빌드해야 할 때 컨텍스트arm32v7를 사용해야 한다고 rpi에 알리는 것입니다.
먼저 docker buildx ls를 사용하여 현재 빌더의 이름을 가져옵니다. 그런 다음 다음 명령을 사용하여 이 빌더에 컨텍스트를 추가합니다.

docker buildx create --append --name you-builder-name --platform linux/arm/v7 rpi

그리고 그게 다야! 이제 멀티 아치 이미지를 만들 수 있습니다.

docker buildx build --tag jdrouet/catapulte:some-tag --platform linux/amd64,linux/i386,linux/arm/v7 .

좋은 웹페이지 즐겨찾기