Sono saltato sul carro della band Apple Silicon non appena ho sentito quanto fossero fantastici e non sono rimasto deluso. Il mio Apple Silicon MacBook Air è ora il mio driver quotidiano che utilizzo per lavoro come ingegnere del software e per progetti personali.
Uso ampiamente Docker nei progetti su cui lavoro, quindi questo ha portato a un problema unico. Quando creo un'immagine Docker sul mio Mac, crea una versione ARM (in particolare arm64). Ciò significa che questa immagine non può essere eseguita su nessun altro dispositivo come un raspberry pi (linux / arm / v7) o un tipico server (linux / amd64) poiché i binari dell'applicazione all'interno non sono compatibili.
Fortunatamente, Docker supporta da un po 'di tempo le build dell'architettura cross CPU attraverso una funzionalità sperimentale chiamata buildx. È un plugin CLI che integra il toolkit Moby BuildKit . Ciò consente di creare un'immagine Docker per una varietà di diverse architetture di CPU e utilizza QEMU sotto il cofano per eseguire l'emulazione.
Come creare un'immagine Docker multi-architettura su Apple Silicon
Questa guida presuppone che tu abbia un Mac dotato di Apple Silicon con macOS Big Sur. È stato scritto con un MacBook Air dotato di Apple M1, quindi i risultati possono variare a seconda dei dispositivi.
Passaggio 1: abilita le funzionalità sperimentali di Docker Desktop
buildx è una funzionalità Docker è attualmente "sperimentale", quindi è necessario abilitare il supporto della funzionalità sperimentale di Docker Desktop.
Per fare ciò, apri Docker Desktop, quindi vai su Preferenze.
Una volta che sei lì, seleziona "Funzionalità sperimentali" e attiva il dispositivo di scorrimento. Fare clic su "Applica e riavvia" per salvare le modifiche e riavviare il demone Docker.
Dopo aver abilitato le funzionalità sperimentali, puoi chiudere le preferenze di Docker Desktop. Nel tuo terminale, apri la cartella che contiene il Dockerfile che desideri creare per più architetture. Eseguire il comando docker buildx ls
per elencare le istanze del generatore correnti. Dovresti vedere qualcosa di simile a sotto.
$ docker buildx ls
NAME/NODE DRIVER/ENDPOINT STATUS PLATFORMS
default * docker
default default running linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/arm/v7, linux/arm/v6
Quindi crea una nuova istanza del builder con il comando docker buildx create --use
modo da poter eseguire più build in parallelo. Senza questo passaggio, dovrai utilizzare il Docker predefinito che supporta solo una singola piattaforma per build. Lo vedrai creato se esegui nuovamente il comando docker buildx ls
.
$ docker buildx lsNAME/NODE DRIVER/ENDPOINT STATUS PLATFORMS
reverent_banach * docker-container
reverent_banach0 unix:///var/run/docker.sock running linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/arm/v7, linux/arm/v6
default docker
default default running linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/arm/v7, linux/arm/v6
Ora puoi usare buildxcome di seguito per avviare una build multi-architettura. Dovrai inviarlo direttamente a un registro (pubblico o privato) con --pushse desideri che Docker gestisca automaticamente il manifest multi-architettura per te. Non dimenticare di taggarlo (l'esempio utilizza il software open source MemberMatters che ho scritto) e aggiungi un elenco di tutte le piattaforme per cui desideri creare. Puoi vedere le piattaforme compatibili dal docker buildx lscomando precedente . Il comando seguente creerà un'immagine per entrambe le piattaforme Apple Silicon Mac (linux/arm64) e x86 standard (linux/amd64).
$ docker buildx build --platform linux/amd64,linux/arm64 --push -t membermatters/membermatters .
La prima volta che esegui una build, dovrai attendere il download dell'immagine Moby BuildKit in modo da vedere qualcosa di simile.
$ docker buildx build --platform linux/amd64,linux/arm64 --push -t membermatters/membermatters .
[+] Building 16.5s (7/43)
=> [internal] booting buildkit 10.4s
=> => pulling image moby/buildkit:buildx-stable-1 8.1s
=> => creating container buildx_buildkit_admiring_shirley0
Una volta terminata la compilazione, verrà automaticamente caricata nel registro configurato. Docker gestirà automaticamente anche l' elenco dei manifest per te. Ciò consente a Docker di combinare le build separate per ciascuna architettura in un unico "manifest". Ciò significa che gli utenti possono eseguire una normale operazione docker pull <image>e il client Docker elaborerà automaticamente l'immagine corretta per la loro architettura della CPU - abbastanza pulito!
Fonte: jaimyn.com.au