Konteineriai, kurie iškart išeina su exec format error, skatina neteisingą instinktą: pridėti galimybę, prijungti įrenginį, redaguoti tunelio konfigūraciją. Nė vienas iš jų nepasiekia problemos. Branduolys apskritai negalėjo įvykdyti dvejetainio failo, o tai konteineryje beveik visada reiškia, kad atvaizdas skirtas kitai nei pagrindinio kompiuterio CPU architektūrai. Viskas, ką galėtumėte pakeisti maršrutizavime, prisijungimo duomenyse ar teisėse, vyksta po to, kai programa jau paleista, o nė viena programa nebuvo paleista.

Paleidimo pranešimas, kuris atrodo kaip konfigūracijos klaida

exec formato gedimas ateina iš įkroviklio, prieš programai perskaičius nors vieną nustatymą. Todėl jis nesukuria jokių konfigūracijos įspėjimų ar tunelio žurnalo, nes nėra gyvo proceso, kuris juos įrašytų. Gedimas taip pat nepaprastai greitas, dažnai prieš konteinerio žurnale apskritai pasirodant nors vienai eilutei. Tas pats trumpas pranešimas rodomas nepriklausomai nuo to, ar dvejetainis failas skirtas kitai architektūrai, kitai operacinei sistemai, ar sugadintas.

Užrašykite vykdymo aplinką ir architektūrą kartu su tiksliu atvaizdo nuoroda, tada patikrinkite, ką ta nuoroda iš tikrųjų siūlo. Docker Desktop aplinkoje konteinerio platforma priklauso Linux virtualiajai mašinai, o ne nešiojamajam kompiuteriui, todėl vien pagrindinio kompiuterio architektūra gali suklaidinti. Perskaitykite šios nuorodos indekso įrašų sąrašą, o ne rinkodaros tekstą jos žymos puslapyje.

Perskaitykite atvaizdo indeksą prieš paleidimo komandą

Kai registras paskelbia kelių platformų nuorodą, žyma rodo į indeksą, o kiekvienas įrašas nurodo platformą su savo digest. Tikrinkite nagrinėjamą nuorodą, o ne gretimą žymą, ir skaitykite indeksą, o ne spėkite, kas jame yra.

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

Pirmoji komanda išvardija platformas, kurias skelbia nuoroda. Antroji praneša apie jau vietoje esančio atvaizdo platformą, ir būtent ją vykdys vykdymo aplinka. Nuoroda su vienu įrašu reiškia, kad kiekvienas pagrindinis kompiuteris gauna tą patį dvejetainį failą, o žyma negali padėti mašinai, kuriai ji niekada nebuvo sukurta.

Žymos pasirenka variantą; jos jo nesukuria

Kelių platformų indeksas leidžia vykdymo aplinkai pasirinkti atitinkantį įrašą, o tai tikrai patogu ir dažnai supainiojama su perkeliamumu. Pasirinkimas yra paieška, o ne vertimas: jei varianto nėra, nėra ko pasirinkti. Todėl ta pati žyma dviejuose kompiuteriuose gali duoti du skirtingus dvejetainius failus, o viename kompiuteryje – nieko naudingo.

Pritvirtinimas digest pašalina dviprasmybę ir taip pat leidžia vėliau peržiūrėti, nes digest tiksliai identifikuoja išbandytus baitus. Saugokite tą digest kartu su diegimo įrašu, o ne pasikliaukite žyma, kuri atsitiktinai buvo aktuali.

Emuliavimas yra susitarimas, o ne vertimo sluoksnis

Emuliavimas per palaikomą vykdymo aplinką gali vykdyti kai kuriuos ne vietinius vartotojo erdvės darbo krūvius, todėl absoliutus teiginys, kad viena architektūra niekada negalės vykdyti kitos atvaizdo, yra klaidingas. Tai taip pat nėra bendras sprendimas. Emuliuotas vykdymas turi skirtingas našumo charakteristikas, o trivialus procesas, kuris paleidžiamas, nieko nepasako apie tai, ar tunelio darbo krūvis elgiasi priimtinai.

Docker kelių platformų vadovas vietinius buildus, kryžminį kompiliavimą ir emuliavimą traktuoja kaip atskiras strategijas, ir tai yra teisingas būdas skaityti parinktis. Pasirinkite vieną sąmoningai ir įvertinkite VPN darbo krūvį pagal ją, o ne manykite lygiavertiškumą.

Leidimai sprendžia kitą problemą

Tinklo administravimo galimybės suteikimas arba TUN įrenginio perdavimas negali priversti nesuderinamo vykdomojo failo veikti. Tai vykdymo leidimai, kuriuos naudoja veikiantis procesas; jie nematomi įkrovikliui, kuris jau atsisakė failo.

Priešingai taip pat tiesa. Vietinis dvejetainis failas nieko neįrodo apie privilegijas, prieigą prie įrenginių, resolver integraciją ar perkrovimo politiką, kurios reikia tuneliui, todėl paleidžiamas konteineris dar nėra veikiantis konteineris. Pirmiausia nustatykite platformos sutartį, tada pereikite prie vykdymo sutarties su jos dokumentuotomis parinktimis.

Laikykite atvaizdo digest, palaikomą tikslą ir konfigūraciją kartu tame pačiame įraše. Žymos naujinimą, kuris tyliai pakeičia architektūrą, lengviau pagauti, kai ankstesnis digest užrašytas, nei kai vienintelis simptomas yra pažįstama klaida ir naujas derinimui skirtas popietė.

Susiję straipsniai