Containerele care se opresc imediat cu exec format error invită la instinctul greșit: adăugarea unei capabilități, montarea unui dispozitiv, editarea configurației tunelului. Niciuna dintre acestea nu ajunge la problemă. Kernelul nu a putut executa deloc binarul, ceea ce într-un container înseamnă aproape întotdeauna că imaginea vizează o arhitectură de CPU diferită de cea a gazdei. Tot ce ai putea schimba la rutare, acreditări sau privilegii se întâmplă după ce un program a pornit, iar niciun program nu a pornit.

Mesajul de pornire care arată ca o eroare de configurare

O eșec de format exec vine de la încărcător, înainte ca aplicația să citească măcar o setare. De aceea nu produce avertismente de configurare și nici jurnal de tunel, pentru că nu există niciun proces viu care să le scrie. Eșecul este și remarcabil de rapid, adesea înainte să apară vreo linie în jurnalul containerului. Același mesaj scurt apare indiferent dacă binarul este pentru altă arhitectură, pentru alt sistem de operare sau este deteriorat.

Notează mediul de execuție și arhitectura împreună cu referința exactă a imaginii, apoi verifică ce oferă de fapt acea referință. Pe Docker Desktop platforma containerului aparține mașinii virtuale Linux, nu laptopului, așa că arhitectura gazdei singură poate induce în eroare. Citește lista de intrări ale indexului pentru această referință, nu textul de marketing de pe pagina etichetei.

Citește indexul imaginii înainte de comanda de rulare

Când un registru publică o referință multiplatformă, eticheta indică un index, iar fiecare intrare numește o platformă cu propriul digest. Inspectează referința aflată în analiză, nu o etichetă vecină, și citește indexul în loc să presupui ce conține.

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

Prima comandă listează platformele pe care le publică referința. A doua raportează platforma imaginii deja prezente local, iar aceasta este cea pe care o va rula mediul de execuție. O referință cu o singură intrare înseamnă că fiecare gazdă primește același binar, iar eticheta nu poate ajuta o mașină pentru care nu a fost construită niciodată.

Etichetele selectează o variantă; nu creează una

Un index multiplatformă permite mediului de execuție să aleagă o intrare potrivită, ceea ce este cu adevărat convenabil și adesea confundat cu portabilitatea. Selecția este o căutare, nu o traducere: dacă varianta lipsește, nu este nimic de selectat. Prin urmare aceeași etichetă pe două gazde poate duce la două binare diferite, iar pe o gazdă nu duce la nimic utilizabil.

Fixarea prin digest elimină ambiguitatea și face posibilă și o revizuire ulterioară, pentru că digestul identifică exact octeții testați. Păstrează acel digest împreună cu înregistrarea de implementare, în loc să te bazezi pe eticheta care se întâmpla să fie actuală.

Emularea este o înțelegere, nu un strat de traducere

Emularea printr-un mediu de execuție acceptat poate rula unele sarcini de lucru ne-native din spațiul utilizator, așa că afirmația absolută că o arhitectură nu va putea rula niciodată imaginea alteia este falsă. De asemenea, nu este o soluție generală. Execuția emulată are caracteristici de performanță diferite, iar un proces trivial care pornește nu îți spune nimic despre dacă o sarcină de tunel se comportă acceptabil.

Ghidul multiplatformă al Docker tratează buildurile native, compilarea încrucișată și emularea ca strategii separate, iar acesta este modul corect de a citi opțiunile. Alege una în mod deliberat și califică sarcina VPN sub ea în loc să presupui echivalență.

Permisiunile rezolvă o altă problemă

Acordarea unei capabilități de administrare a rețelei sau transmiterea unui dispozitiv TUN nu poate face un executabil incompatibil să ruleze. Acestea sunt permisiuni de execuție pe care le folosește un proces aflat în rulare; sunt invizibile pentru un încărcător care a refuzat deja fișierul.

Inversul este la fel de adevărat. Un binar nativ nu dovedește nimic despre privilegii, accesul la dispozitive, integrarea resolverului sau politica de repornire de care are nevoie un tunel, așa că un container care pornește nu este încă un container care funcționează. Stabilește mai întâi contractul platformei, apoi treci la contractul de execuție cu opțiunile sale documentate.

Păstrează digestul imaginii, ținta acceptată și configurația împreună în aceeași înregistrare. O actualizare de etichetă care schimbă silențios arhitectura este mai ușor de prins când digestul anterior este notat, decât atunci când singurul simptom este o eroare cunoscută și o după-amiază nouă de depanare.

Articole similare