El contenedor VPN sale con 'exec format error': plataforma equivocada
'exec format error' significa que el binario está compilado para otra CPU, no que falte NET_ADMIN. Lee el índice de la imagen antes de editar rutas o credenciales.
Los contenedores que salen de inmediato con exec format error invitan al instinto equivocado: añadir una capacidad, montar un dispositivo, editar la configuración del túnel. Ninguna de esas acciones llega al problema. El núcleo no pudo ejecutar el binario en absoluto, lo que en un contenedor casi siempre significa que la imagen apunta a una arquitectura de CPU distinta de la del host. Todo lo que podrías cambiar en el enrutamiento, las credenciales o los privilegios ocurre después de que un programa se haya iniciado, y no se inició ningún programa.
El mensaje de arranque que parece un error de configuración
El fallo de formato exec viene del cargador, antes de que la aplicación lea un solo ajuste. Por eso no produce advertencias de configuración ni registro del túnel, porque no hay ningún proceso vivo que los escriba. El fallo también es notablemente rápido, a menudo antes de que aparezca siquiera una línea en el registro del contenedor. El mismo mensaje breve aparece tanto si el binario es para otra arquitectura, como si es para otro sistema operativo o está dañado.
Registra el entorno de ejecución y la arquitectura junto con la referencia exacta de la imagen y luego comprueba qué ofrece realmente esa referencia. En Docker Desktop la plataforma del contenedor pertenece a la máquina virtual Linux y no al portátil, así que la arquitectura del host por sí sola puede engañar. Lee la lista de entradas del índice de esta referencia en lugar del texto de marketing de su página de etiqueta.
Lee el índice de la imagen antes del comando de ejecución
Cuando un registro publica una referencia multiplataforma, la etiqueta apunta a un índice y cada entrada nombra una plataforma con su propio digest. Inspecciona la referencia que estás revisando, no una etiqueta vecina, y lee el índice en lugar de suponer qué contiene.
docker buildx imagetools inspect ghcr.io/example/vpn:1.4
docker image inspect --format '{{.Os}}/{{.Architecture}}' ghcr.io/example/vpn:1.4
El primer comando enumera las plataformas que publica la referencia. El segundo informa de la plataforma de la imagen que ya está presente localmente, que es la que ejecutará el entorno. Una referencia con una sola entrada significa que cada host recibe el mismo binario, y la etiqueta no puede ayudar a una máquina para la que nunca se compiló.
Las etiquetas seleccionan una variante; no la crean
Un índice multiplataforma permite que el entorno elija una entrada coincidente, lo que resulta realmente cómodo y a menudo se confunde con portabilidad. La selección es una consulta, no una traducción: si la variante no está, no hay nada que seleccionar. Por eso la misma etiqueta en dos hosts puede resolverse en dos binarios distintos, y en un host no se resuelve en nada utilizable.
Fijar por digest elimina la ambigüedad y también hace posible una revisión posterior, porque el digest identifica exactamente los bytes que se probaron. Conserva ese digest con el registro de despliegue en lugar de confiar en la etiqueta que resultó ser la vigente.
La emulación es un arreglo, no una capa de traducción
La emulación mediante un entorno compatible puede ejecutar algunas cargas de espacio de usuario no nativas, así que la afirmación absoluta de que una arquitectura nunca podrá ejecutar la imagen de otra es falsa. Tampoco es una solución general. La ejecución emulada tiene características de rendimiento diferentes, y un proceso trivial que arranca no dice nada sobre si una carga de túnel se comporta de forma aceptable.
La guía multiplataforma de Docker trata las compilaciones nativas, la compilación cruzada y la emulación como estrategias separadas, y esa es la forma correcta de leer las opciones. Elige una deliberadamente y cualifica la carga de VPN bajo ella en lugar de suponer equivalencia.
Los permisos resuelven otro problema
Conceder una capacidad de administración de red o pasar un dispositivo TUN no puede hacer que se ejecute un ejecutable incompatible. Son permisos de ejecución que usa un proceso en marcha; resultan invisibles para un cargador que ya ha rechazado el archivo.
Lo contrario es igualmente cierto. Un binario nativo no demuestra nada sobre privilegios, acceso a dispositivos, integración del resolutor o la política de reinicio que necesita un túnel, así que un contenedor que arranca todavía no es un contenedor que funciona. Establece primero el contrato de plataforma y luego pasa al contrato de ejecución con sus opciones documentadas.
Mantén el digest de la imagen, el objetivo compatible y la configuración juntos en el mismo registro. Una actualización de etiqueta que cambia la arquitectura en silencio es más fácil de detectar cuando el digest anterior está anotado que cuando el único síntoma es un error conocido y una tarde nueva dedicada a depurar.