Kontajner VPN končí s 'exec format error': nesprávna platforma
'exec format error' znamená, že binárka je zostavená pre iný procesor, nie že chýba NET_ADMIN. Prečítajte si index obrazu, než začnete upravovať trasy alebo prihlasovacie údaje.
Kontajnery, ktoré okamžite končia s exec format error, zvádzajú na nesprávny inštinkt: pridať schopnosť, pripojiť zariadenie, upraviť konfiguráciu tunela. Nič z toho sa k problému nedostane. Jadro nemohlo binárku vôbec spustiť, čo v kontajneri takmer vždy znamená, že obraz cieli na inú architektúru procesora, než má hostiteľ. Všetko, čo by ste mohli zmeniť v smerovaní, prihlasovacích údajoch alebo oprávneniach, sa deje po spustení programu, a žiadny program sa nespustil.
Úvodná správa, ktorá vyzerá ako chyba konfigurácie
Zlyhanie formátu exec prichádza od zavádzača, skôr než aplikácia prečíta jediné nastavenie. Preto nevytvára žiadne konfiguračné varovania ani záznam tunela, lebo neexistuje živý proces, ktorý by ich zapísal. Zlyhanie je tiež pozoruhodne rýchle, často skôr, než sa v zázname kontajnera objaví čo i len jeden riadok. Rovnaká krátka správa sa objaví bez ohľadu na to, či je binárka pre inú architektúru, pre iný operačný systém alebo poškodená.
Zaznamenajte runtime prostredie a architektúru spolu s presným odkazom na obraz a potom skontrolujte, čo tento odkaz skutočne ponúka. V Docker Desktop patrí platforma kontajnera virtuálnemu stroju Linux, nie notebooku, takže samotná architektúra hostiteľa môže zmiasť. Prečítajte si zoznam položiek indexu pre tento odkaz, nie marketingový text na stránke jeho značky.
Prečítajte si index obrazu pred príkazom na spustenie
Keď registrácia publikuje multiplatformový odkaz, značka ukazuje na index a každá položka pomenúva platformu s vlastným digestom. Preskúmajte odkaz, ktorý posudzujete, nie susednú značku, a čítajte index namiesto predpokladu, čo obsahuje.
docker buildx imagetools inspect ghcr.io/example/vpn:1.4
docker image inspect --format '{{.Os}}/{{.Architecture}}' ghcr.io/example/vpn:1.4
Prvý príkaz vypisuje platformy, ktoré odkaz publikuje. Druhý hlási platformu obrazu, ktorý už je lokálne prítomný, a práve ten runtime spustí. Odkaz len s jednou položkou znamená, že každý hostiteľ dostane rovnakú binárku, a značka nepomôže stroju, pre ktorý nikdy nebola zostavená.
Značky vyberajú variant; nevytvárajú ho
Multiplatformový index umožňuje runtime vybrať zodpovedajúcu položku, čo je naozaj pohodlné a často sa zamieňa s prenositeľnosťou. Výber je vyhľadanie, nie preklad: ak variant chýba, nie je čo vybrať. Preto tá istá značka na dvoch hostiteľoch môže viesť k dvom rôznym binárkam a na jednom hostiteľovi nevedie k ničomu použiteľnému.
Pripnutie digestom odstraňuje nejednoznačnosť a tiež umožňuje neskoršiu revíziu, pretože digest presne identifikuje testované bajty. Uchovávajte tento digest spolu so záznamom o nasadení, namiesto spoliehania sa na značku, ktorá bola práve aktuálna.
Emulácia je dohoda, nie prekladová vrstva
Emulácia cez podporované runtime prostredie dokáže spustiť niektoré nenatívne záťaže používateľského priestoru, takže absolútne tvrdenie, že jedna architektúra nikdy nemôže spustiť obraz inej, je nesprávne. Tiež to nie je všeobecné riešenie. Emulované spustenie má iné výkonnostné charakteristiky a triviálny proces, ktorý sa spustí, nič nehovorí o tom, či sa záťaž tunela správa prijateľne.
Multiplatformová príručka Dockeru považuje natívne zostavenia, krížovú kompiláciu a emuláciu za oddelené stratégie, a to je správny spôsob, ako čítať možnosti. Vyberte jednu vedome a overte záťaž VPN v jej rámci, namiesto predpokladu rovnocennosti.
Oprávnenia riešia iný problém
Pridelenie schopnosti správy siete alebo preposlanie zariadenia TUN nemôže spôsobiť, že sa nekompatibilný spustiteľný súbor spustí. To sú runtime oprávnenia, ktoré používa bežiaci proces; sú neviditeľné pre zavádzač, ktorý už súbor odmietol.
Opak je rovnako pravdivý. Natívna binárka nič nedokazuje o oprávneniach, prístupe k zariadeniam, integrácii resolvera alebo politike reštartu, ktorú tunel potrebuje, takže kontajner, ktorý sa spustí, ešte nie je kontajner, ktorý funguje. Najprv stanovte kontrakt platformy, potom prejdite na runtime kontrakt s jeho dokumentovanými možnosťami.
Uchovávajte digest obrazu, podporovaný cieľ a konfiguráciu spolu v tom istom zázname. Aktualizáciu značky, ktorá potichu zmení architektúru, je ľahšie zachytiť, keď je predchádzajúci digest zapísaný, než keď je jediným príznakom známa chyba a nové popoludnie strávené ladením.