El contenidor VPN surt amb 'exec format error': plataforma equivocada
'exec format error' vol dir que el binari està compilat per a una altra CPU, no que falti NET_ADMIN. Llegeix l’índex de la imatge abans d’editar rutes o credencials.
Els contenidors que surten immediatament amb exec format error desperten l’instint equivocat: afegir una capacitat, muntar un dispositiu, editar la configuració del túnel. Cap d’aquestes coses arriba al problema. El nucli no va poder executar el binari en absolut, cosa que en un contenidor gairebé sempre vol dir que la imatge apunta a una arquitectura de CPU diferent de la de l’amfitrió. Tot el que podríeu canviar en encaminament, credencials o privilegis passa després que un programa s’hagi iniciat, i no s’ha iniciat cap programa.
El missatge d’inici que sembla un error de configuració
La fallada de format exec ve del carregador, abans que l’aplicació llegeixi cap paràmetre. Per això no produeix cap avís de configuració ni cap registre del túnel, perquè no hi ha cap procés viu que els escrigui. La fallada també és extraordinàriament ràpida, sovint abans que aparegui cap línia al registre del contenidor. El mateix missatge curt apareix tant si el binari és per a una altra arquitectura, com si és per a un altre sistema operatiu o està malmès.
Registreu l’entorn d’execució i l’arquitectura al costat de la referència exacta de la imatge, i després comproveu què ofereix realment aquesta referència. A Docker Desktop la plataforma del contenidor pertany a la màquina virtual Linux, no a l’ordinador portàtil, així que l’arquitectura de l’amfitrió per si sola pot enganyar. Llegiu la llista d’entrades de l’índex d’aquesta referència, en lloc del text de màrqueting de la seva pàgina d’etiqueta.
Llegeix l’índex de la imatge abans de l’ordre d’execució
Quan un registre publica una referència multiplataforma, l’etiqueta apunta a un índex i cada entrada anomena una plataforma amb el seu propi digest. Inspeccioneu la referència que esteu revisant, no una etiqueta veïna, i llegiu l’índex en lloc de suposar què conté.
docker buildx imagetools inspect ghcr.io/example/vpn:1.4
docker image inspect --format '{{.Os}}/{{.Architecture}}' ghcr.io/example/vpn:1.4
La primera ordre llista les plataformes que publica la referència. La segona informa de la plataforma de la imatge que ja és present localment, que és la que executarà l’entorn. Una referència amb una sola entrada vol dir que cada amfitrió rep el mateix binari, i l’etiqueta no pot ajudar una màquina per a la qual mai no es va compilar.
Les etiquetes seleccionen una variant; no la creen
Un índex multiplataforma permet que l’entorn triï una entrada coincident, cosa que és realment convenient i sovint es confon amb portabilitat. La selecció és una consulta, no una traducció: si la variant no hi és, no hi ha res a seleccionar. Per tant, la mateixa etiqueta en dos amfitrions pot resoldre’s a dos binaris diferents, i en un amfitrió no es resol a res utilitzable.
Fixar pel digest elimina l’ambigüitat i també fa possible una revisió posterior, perquè el digest identifica exactament els bytes que es van provar. Guardeu aquest digest amb el registre de desplegament en lloc de confiar en l’etiqueta que casualment era vigent.
L’emulació és un arranjament, no una capa de traducció
L’emulació a través d’un entorn compatible pot executar algunes càrregues d’espai d’usuari no natives, així que l’afirmació absoluta que una arquitectura mai no pot executar la imatge d’una altra és falsa. Tampoc no és una solució general. L’execució emulada té característiques de rendiment diferents, i un procés trivial que s’inicia no us diu res sobre si una càrrega de túnel es comporta de manera acceptable.
La guia multiplataforma de Docker tracta les compilacions natives, la compilació creuada i l’emulació com a estratègies separades, que és la manera correcta de llegir les opcions. Trieu-ne una deliberadament i qualifiqueu la càrrega VPN sota aquesta, en lloc de suposar equivalència.
Els permisos resolen un problema diferent
Concedir una capacitat d’administració de xarxa o passar un dispositiu TUN no pot fer que s’executi un executable incompatible. Aquests són permisos d’execució que utilitza un procés en marxa; són invisibles per a un carregador que ja ha refusat el fitxer.
El contrari també és cert. Un binari natiu no demostra res sobre privilegis, accés a dispositius, integració del resolutor o la política de reinici que necessita un túnel, així que un contenidor que s’inicia encara no és un contenidor que funciona. Establiu primer el contracte de plataforma i després passeu al contracte d’execució amb les seves opcions documentades.
Manteniu el digest de la imatge, l’objectiu compatible i la configuració junts en el mateix registre. Una actualització d’etiqueta que canvia silenciosament l’arquitectura és més fàcil de detectar quan el digest anterior està escrit que quan l’únic símptoma és un error familiar i una tarda nova dedicada a la depuració.