Os contedores que saen de inmediato con exec format error invitan ao instinto equivocado: engadir unha capacidade, montar un dispositivo, editar a configuración do túnel. Ningunha desas accións chega ao problema. O núcleo non puido executar o binario en absoluto, o que nun contedor case sempre significa que a imaxe apunta a unha arquitectura de CPU distinta da do host. Todo o que poderías cambiar no enrutamento, as credenciais ou os privilexios ocorre despois de que un programa se iniciase, e non se iniciou ningún programa.

A mensaxe de arranque que parece un erro de configuración

O fallo de formato exec vén do cargador, antes de que a aplicación lea un só axuste. Por iso non produce advertencias de configuración nin rexistro do túnel, porque non hai ningún proceso vivo que os escriba. O fallo tamén é notablemente rápido, a miúdo antes de que apareza sequera unha liña no rexistro do contedor. A mesma mensaxe breve aparece tanto se o binario é para outra arquitectura, coma se é para outro sistema operativo ou está danado.

Rexistra a contorna de execución e a arquitectura xunto coa referencia exacta da imaxe e logo comproba que ofrece realmente esa referencia. En Docker Desktop a plataforma do contedor pertence á máquina virtual Linux e non ao portátil, así que a arquitectura do host por si soa pode enganar. Le a lista de entradas do índice desta referencia en lugar do texto de márketing da súa páxina de etiqueta.

Le o índice da imaxe antes do comando de execución

Cando un rexistro publica unha referencia multiplataforma, a etiqueta apunta a un índice e cada entrada nomea unha plataforma co seu propio digest. Inspecciona a referencia que estás a revisar, non unha etiqueta veciña, e le o índice en lugar de supoñer que contén.

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

O primeiro comando enumera as plataformas que publica a referencia. O segundo informa da plataforma da imaxe que xa está presente localmente, que é a que executará a contorna. Unha referencia cunha soa entrada significa que cada host recibe o mesmo binario, e a etiqueta non pode axudar a unha máquina para a que nunca se compilou.

As etiquetas seleccionan unha variante; non a crean

Un índice multiplataforma permite que a contorna elixa unha entrada coincidente, o que resulta realmente cómodo e a miúdo confúndese coa portabilidade. A selección é unha consulta, non unha tradución: se a variante non está, non hai nada que seleccionar. Por iso a mesma etiqueta en dous hosts pode resolverse en dous binarios distintos, e nun host non se resolve en nada utilizable.

Fixar por digest elimina a ambigüidade e tamén fai posible unha revisión posterior, porque o digest identifica exactamente os bytes que se probaron. Conserva ese digest co rexistro de despregamento en lugar de confiar na etiqueta que resultou ser a vixente.

A emulación é un arranxo, non unha capa de tradución

A emulación mediante unha contorna compatible pode executar algunhas cargas de espazo de usuario non nativas, así que a afirmación absoluta de que unha arquitectura nunca poderá executar a imaxe doutra é falsa. Tampouco é unha solución xeral. A execución emulada ten características de rendemento diferentes, e un proceso trivial que arranca non di nada sobre se unha carga de túnel se comporta de forma aceptable.

A guía multiplataforma de Docker trata as compilacións nativas, a compilación cruzada e a emulación como estratexias separadas, e esa é a forma correcta de ler as opcións. Escolle unha deliberadamente e cualifica a carga de VPN baixo ela en lugar de supoñer equivalencia.

Os permisos resolven outro problema

Conceder unha capacidade de administración de rede ou pasar un dispositivo TUN non pode facer que se execute un executable incompatible. Son permisos de execución que usa un proceso en marcha; resultan invisibles para un cargador que xa rexeitou o ficheiro.

O contrario tamén é certo. Un binario nativo non demostra nada sobre privilexios, acceso a dispositivos, integración do resolutor ou a política de reinicio que necesita un túnel, así que un contedor que arranca aínda non é un contedor que funciona. Establece primeiro o contrato de plataforma e despois pasa ao contrato de execución coas súas opcións documentadas.

Mantén o digest da imaxe, o obxectivo compatible e a configuración xuntos no mesmo rexistro. Unha actualización de etiqueta que cambia a arquitectura en silencio é máis fácil de detectar cando o digest anterior está anotado que cando o único síntoma é un erro coñecido e unha tarde nova dedicada a depurar.

Artigos relacionados