A exec format error hibával azonnal kilépő konténerek rossz ösztönt keltenek: adjunk hozzá képességet, csatoljunk eszközt, szerkesszük az alagút konfigurációját. Ezek egyike sem éri el a problémát. A kernel egyáltalán nem tudta végrehajtani a binárist, ami egy konténerben szinte mindig azt jelenti, hogy az image a hostétól eltérő CPU-architektúrát céloz. Minden, amit az útvonalakon, hitelesítő adatokon vagy jogosultságokon módosíthatna, azután történik, hogy egy program elindult, és egyetlen program sem indult el.

A konfigurációs hibának tűnő indítási üzenet

Az exec-formátum meghibásodása a betöltőtől származik, mielőtt az alkalmazás egyetlen beállítást is beolvasna. Ezért nem generál konfigurációs figyelmeztetéseket és alagútnaplót, mert nincs élő folyamat, amely kiírná őket. A hiba emellett figyelemre méltóan gyors, gyakran még azelőtt, hogy egyáltalán megjelenne egy sor a konténer naplójában. Ugyanez a rövid üzenet jelenik meg, akár más architektúrához, akár más operációs rendszerhez készült a bináris, akár sérült.

Rögzítse a futtatókörnyezetet és az architektúrát a pontos image-hivatkozással együtt, majd ellenőrizze, mit kínál valójában ez a hivatkozás. A Docker Desktopon a konténer platformja a Linux virtuális géphez tartozik, nem a laptophoz, ezért a host architektúrája önmagában megtéveszthet. Olvassa el a hivatkozás indexbejegyzéseit, ne a tag-oldalának marketing szövegét.

Olvassa el az image indexét a futtatási parancs előtt

Amikor egy registry többplatformos hivatkozást tesz közzé, a tag egy indexre mutat, és minden bejegyzés saját digesttel nevez meg egy platformot. Vizsgálja meg a szóban forgó hivatkozást, ne egy szomszédos taget, és olvassa el az indexet ahelyett, hogy feltételezné a tartalmát.

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

Az első parancs felsorolja a hivatkozás által közzétett platformokat. A második a helyben már jelen lévő image platformját jelenti, és pontosan azt fogja futtatni a futtatókörnyezet. Egyetlen bejegyzéssel rendelkező hivatkozás azt jelenti, hogy minden host ugyanazt a binárist kapja, és a tag nem tud segíteni egy olyan gépen, amelyhez soha nem építették.

A tagek variánst választanak; nem hoznak létre egyet

A többplatformos index lehetővé teszi a futtatókörnyezetnek, hogy megfelelő bejegyzést válasszon, ami valóban kényelmes, és gyakran összetévesztik a hordozhatósággal. A kiválasztás egy keresés, nem fordítás: ha a variáns hiányzik, nincs mit kiválasztani. Ezért ugyanaz a tag két hoston két különböző binárist eredményezhet, egy hoston pedig semmi használhatót.

A digesttel való rögzítés megszünteti a kétértelműséget, és lehetővé tesz egy későbbi felülvizsgálatot is, mert a digest pontosan azonosítja a tesztelt bájtokat. Őrizze meg ezt a digestet a telepítési rekorddal együtt, ahelyett hogy arra a tagre támaszkodna, amely éppen aktuális volt.

Az emuláció egy megegyezés, nem fordítási réteg

A támogatott futtatókörnyezeten keresztüli emuláció képes néhány nem natív felhasználói térbeli terhelést futtatni, ezért az az abszolút állítás, hogy egy architektúra soha nem futtathatja egy másik image-ét, hamis. Ez sem általános megoldás. Az emulált végrehajtás teljesítményjellemzői eltérőek, és egy triviális folyamat elindulása semmit nem mond arról, hogy az alagút-terhelés elfogadhatóan viselkedik-e.

A Docker többplatformos útmutatója a natív buildeket, a keresztfordítást és az emulációt külön stratégiákként kezeli, és ez a helyes módja a lehetőségek olvasásának. Válasszon egyet szándékosan, és a VPN-terhelést ez alatt minősítse, ne pedig egyenértékűséget feltételezzen.

Az engedélyek más problémát oldanak meg

Hálózati adminisztrációs képesség adása vagy TUN-eszköz átadása nem tud működésre bírni egy inkompatibilis végrehajtható fájlt. Ezek futtatókörnyezeti engedélyek, amelyeket egy futó folyamat használ; láthatatlanok egy betöltő számára, amely már elutasította a fájlt.

Az ellenkezője ugyanígy igaz. Egy natív bináris semmit nem bizonyít a jogosultságokról, az eszközhozzáférésről, a resolver-integrációról vagy az újraindítási szabályzatról, amelyre egy alagútnak szüksége van, ezért az elinduló konténer még nem működő konténer. Először a platform-szerződést rögzítse, majd lépjen tovább a futtatókörnyezeti szerződésre, annak dokumentált lehetőségeivel.

Tartsa együtt az image digestjét, a támogatott célt és a konfigurációt ugyanabban a rekordban. A csendesen architektúrát váltó tagfrissítést könnyebb elkapni, ha az előző digest le van írva, mint ha az egyetlen tünet egy ismerős hiba és egy friss hibakereséssel töltött délután.

Kapcsolódó cikkek