Os contêineres que saem imediatamente com exec format error convidam ao instinto errado: adicionar uma capacidade, montar um dispositivo, editar a configuração do túnel. Nenhuma dessas ações chega ao problema. O kernel não conseguiu executar o binário de forma alguma, o que em um contêiner quase sempre significa que a imagem se destina a uma arquitetura de CPU diferente da do host. Tudo o que você poderia mudar no roteamento, nas credenciais ou nos privilégios acontece depois que um programa iniciou, e nenhum programa iniciou.

A mensagem de inicialização que parece um erro de configuração

A falha de formato exec vem do carregador, antes de a aplicação ler uma única configuração. Por isso, não produz avisos de configuração nem registro do túnel, porque não há nenhum processo vivo para escrevê-los. A falha também é notavelmente rápida, muitas vezes antes de aparecer qualquer linha no registro do contêiner. A mesma mensagem curta aparece tanto se o binário é para outra arquitetura, como se é para outro sistema operacional ou está danificado.

Registre o ambiente de execução e a arquitetura junto com a referência exata da imagem e depois verifique o que essa referência realmente oferece. No Docker Desktop, a plataforma do contêiner pertence à máquina virtual Linux e não ao notebook, então a arquitetura do host sozinha pode enganar. Leia a lista de entradas do índice para esta referência em vez do texto de marketing na página da etiqueta.

Leia o índice da imagem antes do comando de execução

Quando um registro publica uma referência multiplataforma, a etiqueta aponta para um índice e cada entrada nomeia uma plataforma com seu próprio digest. Inspecione a referência em análise, não uma etiqueta vizinha, e leia o índice em vez de presumir o que ele contém.

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 lista as plataformas que a referência publica. O segundo informa a plataforma da imagem já presente localmente, que é a que o ambiente de execução executará. Uma referência com apenas uma entrada significa que todo host recebe o mesmo binário, e a etiqueta não pode ajudar uma máquina para a qual nunca foi compilada.

As etiquetas selecionam uma variante; não a criam

Um índice multiplataforma permite que o ambiente escolha uma entrada correspondente, o que é realmente conveniente e muitas vezes confundido com portabilidade. A seleção é uma consulta, não uma tradução: se a variante não existe, não há nada a selecionar. Por isso a mesma etiqueta em dois hosts pode resultar em dois binários diferentes, e em um host não resulta em nada utilizável.

Fixar por digest elimina a ambiguidade e também torna possível uma revisão posterior, porque o digest identifica exatamente os bytes testados. Guarde esse digest com o registro de implantação em vez de confiar na etiqueta que por acaso estava em vigor.

A emulação é um arranjo, não uma camada de tradução

A emulação por meio de um ambiente compatível pode executar algumas cargas de trabalho de espaço do usuário não nativas, então a afirmação absoluta de que uma arquitetura nunca poderá executar a imagem de outra é falsa. Também não é uma solução geral. A execução emulada tem características de desempenho diferentes, e um processo trivial que inicia não diz nada sobre se uma carga de trabalho de túnel se comporta de forma aceitável.

O guia multiplataforma do Docker trata compilações nativas, compilação cruzada e emulação como estratégias separadas, e essa é a forma correta de ler as opções. Escolha uma deliberadamente e qualifique a carga de VPN sob ela em vez de presumir equivalência.

As permissões resolvem um problema diferente

Conceder uma capacidade de administração de rede ou passar um dispositivo TUN não pode fazer um executável incompatível rodar. Essas são permissões de execução que um processo em execução usa; são invisíveis para um carregador que já recusou o arquivo.

O contrário é igualmente verdadeiro. Um binário nativo não prova nada sobre privilégios, acesso a dispositivos, integração do resolvedor ou a política de reinício de que um túnel precisa, então um contêiner que inicia ainda não é um contêiner que funciona. Estabeleça primeiro o contrato de plataforma e depois passe ao contrato de execução com suas opções documentadas.

Mantenha o digest da imagem, o alvo compatível e a configuração juntos no mesmo registro. Uma atualização de etiqueta que muda silenciosamente a arquitetura é mais fácil de detectar quando o digest anterior está anotado do que quando o único sintoma é um erro conhecido e uma tarde nova dedicada à depuração.

Artigos relacionados