Kontainer yang langsung keluar dengan exec format error memicu insting yang salah: menambahkan kapabilitas, memasang perangkat, mengedit konfigurasi tunnel. Tak satu pun dari itu mencapai masalahnya. Kernel sama sekali tidak dapat menjalankan biner, yang dalam kontainer hampir selalu berarti image menargetkan arsitektur CPU yang berbeda dari host. Semua yang mungkin Anda ubah pada perutean, kredensial, atau hak istimewa terjadi setelah sebuah program dimulai, dan tidak ada program yang dimulai.

Pesan awal yang tampak seperti kesalahan konfigurasi

Kegagalan format exec berasal dari loader, sebelum aplikasi membaca satu pengaturan pun. Itulah sebabnya ia tidak menghasilkan peringatan konfigurasi maupun log tunnel, karena tidak ada proses hidup yang menulisnya. Kegagalan itu juga luar biasa cepat, sering kali sebelum satu baris pun muncul di log kontainer. Pesan singkat yang sama muncul baik biner itu untuk arsitektur lain, untuk sistem operasi lain, maupun rusak.

Catat lingkungan runtime dan arsitektur bersama referensi image yang tepat, lalu periksa apa yang sebenarnya ditawarkan referensi itu. Di Docker Desktop, platform kontainer milik mesin virtual Linux, bukan laptop, sehingga arsitektur host saja bisa menyesatkan. Baca daftar entri indeks untuk referensi ini, bukan teks pemasaran di halaman tag-nya.

Baca indeks image sebelum perintah menjalankan

Saat registri menerbitkan referensi multiplatform, tag menunjuk ke indeks, dan setiap entri menyebut platform dengan digest-nya sendiri. Periksa referensi yang sedang ditinjau, bukan tag tetangga, dan baca indeksnya alih-alih mengasumsikan isinya.

docker buildx imagetools inspect ghcr.io/example/vpn:1.4
docker image inspect --format '{{.Os}}/{{.Architecture}}' ghcr.io/example/vpn:1.4

Perintah pertama mencantumkan platform yang diterbitkan referensi. Perintah kedua melaporkan platform image yang sudah ada secara lokal, dan itulah yang akan dijalankan runtime. Referensi dengan hanya satu entri berarti setiap host menerima biner yang sama, dan tag tidak dapat membantu mesin yang tidak pernah menjadi target pembangunannya.

Tag memilih varian; tag tidak membuatnya

Indeks multiplatform memungkinkan runtime memilih entri yang cocok, yang benar-benar praktis dan sering disalahartikan sebagai portabilitas. Pemilihan itu pencarian, bukan penerjemahan: jika varian tidak ada, tidak ada yang bisa dipilih. Karena itu tag yang sama pada dua host dapat menghasilkan dua biner berbeda, dan pada satu host tidak menghasilkan apa pun yang dapat dipakai.

Penyematan dengan digest menghilangkan ambiguitas dan juga memungkinkan peninjauan di kemudian hari, karena digest mengidentifikasi persis byte yang diuji. Simpan digest itu bersama catatan penerapan alih-alih mengandalkan tag yang kebetulan sedang berlaku.

Emulasi adalah pengaturan, bukan lapisan penerjemahan

Emulasi melalui runtime yang didukung dapat menjalankan sebagian beban kerja ruang pengguna non-native, sehingga klaim mutlak bahwa satu arsitektur tidak akan pernah bisa menjalankan image arsitektur lain adalah salah. Itu juga bukan solusi umum. Eksekusi teremulasi memiliki karakteristik kinerja berbeda, dan proses sepele yang mulai berjalan tidak memberi tahu Anda apakah beban kerja tunnel berperilaku memadai.

Panduan multiplatform Docker memperlakukan build native, kompilasi silang, dan emulasi sebagai strategi terpisah, dan itulah cara yang benar untuk membaca pilihan. Pilih satu dengan sengaja, dan kualifikasi beban kerja VPN di bawahnya alih-alih mengasumsikan kesetaraan.

Izin menyelesaikan masalah yang berbeda

Memberi kapabilitas administrasi jaringan atau meneruskan perangkat TUN tidak dapat membuat berkas eksekusi yang tidak kompatibel berjalan. Ini izin runtime yang dipakai proses yang berjalan; izin itu tidak terlihat oleh loader yang sudah menolak berkasnya.

Sebaliknya juga sama benarnya. Biner native tidak membuktikan apa pun tentang hak istimewa, akses perangkat, integrasi resolver, atau kebijakan mulai ulang yang dibutuhkan tunnel, jadi kontainer yang mulai berjalan belum tentu kontainer yang berfungsi. Tetapkan kontrak platform lebih dulu, lalu beralih ke kontrak runtime dengan opsi yang terdokumentasi.

Simpan digest image, target yang didukung, dan konfigurasi bersama dalam catatan yang sama. Pembaruan tag yang diam-diam mengubah arsitektur lebih mudah ditangkap ketika digest sebelumnya tertulis, daripada ketika satu-satunya gejala adalah kesalahan yang familier dan sore baru untuk menelusuri.

Artikel terkait