Kontejner VPN končí s 'exec format error': špatná platforma
'exec format error' znamená, že binárka je sestavena pro jiný procesor, ne že chybí NET_ADMIN. Přečtěte si index obrazu, než začnete upravovat trasy nebo přihlašovací údaje.
Kontejnery, které okamžitě končí s exec format error, svádějí ke špatnému instinktu: přidat schopnost, připojit zařízení, upravit konfiguraci tunelu. Nic z toho se k problému nedostane. Jádro nemohlo binárku vůbec spustit, což v kontejneru téměř vždy znamená, že obraz cílí na jinou architekturu procesoru, než má hostitel. Vše, co byste mohli změnit v routování, údajích nebo oprávněních, se odehrává poté, co se program spustil, a žádný program se nespustil.
Úvodní zpráva, která vypadá jako chyba konfigurace
Selhání formátu exec přichází od zavaděče, dříve než aplikace přečte jediné nastavení. Proto nevytváří žádná konfigurační varování ani záznam tunelu, protože neexistuje živý proces, který by je zapsal. Selhání je také pozoruhodně rychlé, často dříve, než se v záznamu kontejneru objeví vůbec nějaký řádek. Stejná krátká zpráva se objeví, ať už je binárka pro jinou architekturu, pro jiný operační systém, nebo poškozená.
Zaznamenejte běhové prostředí a architekturu spolu s přesným odkazem na obraz a poté zkontrolujte, co tento odkaz skutečně nabízí. V Docker Desktop patří platforma kontejneru virtuálnímu stroji s Linuxem, nikoli notebooku, takže samotná architektura hostitele může zmást. Přečtěte si seznam položek indexu pro tento odkaz, místo marketingového textu na stránce jeho značky.
Přečtěte si index obrazu před příkazem ke spuštění
Když registr publikuje multiplatformní odkaz, značka ukazuje na index a každá položka pojmenovává platformu s vlastním digestem. Prohlédněte si odkaz, který posuzujete, ne sousední značku, a čtěte index, místo abyste předpokládali, co obsahuje.
docker buildx imagetools inspect ghcr.io/example/vpn:1.4
docker image inspect --format '{{.Os}}/{{.Architecture}}' ghcr.io/example/vpn:1.4
První příkaz vypisuje platformy, které odkaz publikuje. Druhý hlásí platformu obrazu, který už je lokálně přítomný, a právě ten běhové prostředí spustí. Odkaz jen s jednou položkou znamená, že každý hostitel dostane stejnou binárku, a značka nepomůže stroji, pro který nikdy nebyla sestavena.
Značky vybírají variantu; nevytvářejí ji
Multiplatformní index umožňuje běhovému prostředí vybrat odpovídající položku, což je skutečně pohodlné a často se to zaměňuje za přenositelnost. Výběr je vyhledání, ne překlad: pokud varianta chybí, není co vybrat. Stejná značka tedy na dvou hostitelích může vést ke dvěma různým binárkám a na jednom hostiteli nevede k ničemu použitelnému.
Připnutí digestem odstraňuje nejednoznačnost a také umožňuje pozdější revizi, protože digest přesně určuje bajty, které byly testovány. Uchovávejte tento digest spolu se záznamem o nasazení, místo abyste se spoléhali na značku, která byla zrovna aktuální.
Emulace je opatření, ne překladová vrstva
Emulace přes podporované běhové prostředí dokáže spustit některé nenativní zátěže v uživatelském prostoru, takže absolutní tvrzení, že jedna architektura nikdy nemůže spustit obraz jiné, je chybné. Také to není obecné řešení. Emulované spuštění má jiné výkonnostní charakteristiky a triviální proces, který se spustí, nic neříká o tom, zda se zátěž tunelu chová přijatelně.
Multiplatformní průvodce Dockeru považuje nativní sestavení, křížovou kompilaci a emulaci za oddělené strategie, a to je správný způsob, jak tyto možnosti číst. Vyberte jednu vědomě a prověřte zátěž VPN pod ní, místo abyste předpokládali rovnocennost.
Oprávnění řeší jiný problém
Přidělení schopnosti správy sítě nebo předání zařízení TUN nemůže způsobit, že se nekompatibilní spustitelný soubor spustí. To jsou běhová oprávnění, která používá běžící proces; jsou neviditelná pro zavaděč, který už soubor odmítl.
Opak je stejně pravdivý. Nativní binárka nic nedokazuje o oprávněních, přístupu k zařízením, integraci resolveru nebo politice restartu, kterou tunel potřebuje, takže kontejner, který se spustí, ještě není kontejner, který funguje. Nejprve stanovte smlouvu o platformě a poté přejděte ke smlouvě o běhovém prostředí s jejími dokumentovanými možnostmi.
Uchovávejte digest obrazu, podporovaný cíl a konfiguraci společně ve stejném záznamu. Aktualizaci značky, která tiše změní architekturu, je snazší zachytit, když je předchozí digest zapsaný, než když je jediným symptomem známá chyba a nové odpoledne strávené laděním.