Peta dunia

 

EN: Read in English

Dunia D2: Resepi

amd64 atau arm64? buildx

Anda akan belajar: kenapa pek boleh gagal pada CPU lain, dan cara buildx bakar untuk dua sekali gus.

Teks BM belum disemak oleh penutur asli.

Disemak dengan Docker Engine 29 pada 31 Okt 2026

Masalahnya

bash
docker run --rm --platform linux/arm64 hello:1.0
exec /bin/cat: exec format error
Pada komputer amd64, menjalankan versi arm64 hello:1.0 gagal: exec /bin/cat: exec format error.

Aina bakar pek itu di Mac yang guna cip Apple. Server pula guna cip Intel. Ia terus berhenti. Ralat sebenar: exec format error. Maksudnya: dimasak untuk jenis CPU lain.

Cuba

Setiap image dibina untuk satu platform: Jenis OS dan CPU yang image dibina untuknya, contohnya linux/amd64 atau linux/arm64.: satu OS dan satu jenis CPU. CPU mana yang ada pada setiap mesin?

Seret kad ke dalam kotak. Atau ketik kad, kemudian ketik kotak.

      Tengok

      bash
      docker buildx build --platform linux/amd64,linux/arm64 -t hello:1.0 .
      [+] Building 1.9s (10/10) FINISHED docker:default
      => [linux/amd64 1/2] FROM docker.io/library/alpine:3.22@sha256:2e0b81d60 0.3s
      => [linux/arm64 1/2] FROM docker.io/library/alpine:3.22@sha256:2e0b81d60 0.4s
      => [linux/amd64 2/2] COPY hello.txt /hello.txt 0.0s
      => [linux/arm64 2/2] COPY hello.txt /hello.txt 0.0s
      => exporting to image 0.2s
      docker buildx build untuk linux/amd64 dan linux/arm64. Setiap langkah jalan dua kali, sekali untuk setiap platform, kemudian satu nama diberi kepada kedua-duanya.

      buildx bakar untuk dua platform sekali gus. Setiap langkah jalan dua kali, sekali untuk setiap CPU. Kedua-dua pek kongsi satu nama.

      Cuba

      Bina arahan yang bakar hello:1.0 untuk kedua-dua keluarga CPU.

      Ketik kepingan ikut turutan yang betul.

      …

      Teka

      hello:1.0 kini ada dua pek di dalamnya. Sebuah Raspberry Pi pull image itu. Apa yang ia dapat?

      Pilih satu jawapan.

      Semak

      bash
      docker images --tree hello
      IMAGE ID DISK USAGE CONTENT SIZE EXTRA
      hello:1.0 31ab2ae30f0b 16.9MB 7.93MB
      ├─ linux/amd64 7ce15f9d7cf4 12.8MB 3.8MB
      └─ linux/arm64 7c100815fc45 4.13MB 4.13MB
      docker images --tree tunjuk hello:1.0 dengan dua pek di dalam: linux/amd64 dan linux/arm64.

      docker images --tree tunjuk satu nama dengan dua pek di dalam. Senarai itu dipanggil image index.

      Cuba

      Laptop latihan anda amd64. Bina untuknya dengan sengaja sebagai hello:amd64, kemudian jalankan.

      Laptop anda~/hello

      • Tiada tingkap terbuka

      Bekas (container)

      • Belum ada container

      Pek beku (image)

      • alpine:3.221 layer · 12.9MB

      0 container (0 berjalan), 1 image, 0 loker.

      Anda berjaya!

      Kini anda boleh bina image untuk amd64 dan arm64.

      Nak tahu lebih (pilihan)

      Untuk jalankan langkah bagi CPU lain, Docker boleh guna emulator bernama QEMU. Ia perlahan, jadi pasukan besar selalu bina setiap platform di mesinnya sendiri.

      Di mana cerita ini tak tepat: tukang masak dapat kek sama dari resepi sama. Dockerfile mungkin tidak. RUN apk add curl boleh ambil curl yang lebih baharu bulan depan. Tetapkan versi untuk kekalkan rasa.

      Misi sebenar

      1. docker version --format "{{.Server.Arch}}"
      2. docker buildx build --platform linux/amd64,linux/arm64 -t hello:1.0 .
      3. docker images --tree hello

      0 daripada 3 langkah siap · Tanda anda disimpan.