Kontejneri VPN del me 'exec format error': platformë e gabuar
'exec format error' do të thotë që binari është ndërtuar për një CPU tjetër, jo se mungon NET_ADMIN. Lexo indeksin e imazhit përpara se të editosh rrugët ose kredencialet.
Kontejnerët që dalin menjëherë me exec format error nxisin instinktin e gabuar: shtimi i një aftësie, montimi i një pajisjeje, editimi i konfigurimit të tunelit. Asnjëra prej tyre nuk arrin te problemi. Kerneli nuk mundi ta ekzekutonte binarin fare, çka në një kontejner pothuajse gjithmonë do të thotë që imazhi synon një arkitekturë CPU-je të ndryshme nga ajo e hostit. Çdo gjë që mund të ndryshoje në rrugëtim, kredenciale ose privilegje ndodh pasi një program ka nisur, dhe asnjë program nuk nisi.
Mesazhi i nisjes që duket si gabim konfigurimi
Një dështim i formatit exec vjen nga ngarkuesi, përpara se aplikacioni të lexojë edhe një rregullim të vetëm. Për këtë arsye nuk prodhon paralajmërime konfigurimi as regjistër tuneli, sepse nuk ka asnjë proces të gjallë që t'i shkruajë ato. Dështimi është gjithashtu jashtëzakonisht i shpejtë, shpesh përpara se të shfaqet edhe një rresht në regjistrin e kontejnerit. I njëjti mesazh i shkurtër shfaqet pavarësisht nëse binari është për një arkitekturë tjetër, për një sistem operativ tjetër apo i dëmtuar.
Shëno mjedisin e ekzekutimit dhe arkitekturën bashkë me referencën e saktë të imazhit, pastaj kontrollo çfarë ofron në të vërtetë ajo referencë. Në Docker Desktop platforma e kontejnerit i përket makinës virtuale Linux dhe jo laptopit, prandaj arkitektura e hostit vetëm mund të mashtrojë. Lexo listën e hyrjeve të indeksit për këtë referencë, jo tekstin e marketingut në faqen e etiketës së saj.
Lexo indeksin e imazhit përpara komandës së ekzekutimit
Kur një regjistër publikon një referencë shumë-platformëshe, etiketa tregon një indeks, dhe çdo hyrje emërton një platformë me digestin e vet. Inspekto referencën në shqyrtim dhe jo një etiketë fqinje, dhe lexo indeksin në vend që të supozosh çfarë përmban.
docker buildx imagetools inspect ghcr.io/example/vpn:1.4
docker image inspect --format '{{.Os}}/{{.Architecture}}' ghcr.io/example/vpn:1.4
Komanda e parë liston platformat që publikon referenca. E dyta raporton platformën e imazhit që është tashmë i pranishëm lokalisht, dhe pikërisht atë do të ekzekutojë mjedisi i ekzekutimit. Një referencë me vetëm një hyrje do të thotë që çdo host merr të njëjtin binar, dhe etiketa nuk mund të ndihmojë një makinë për të cilën nuk është ndërtuar kurrë.
Etiketat zgjedhin një variant; nuk e krijojnë atë
Një indeks shumë-platformësh i lejon mjedisit të ekzekutimit të zgjedhë një hyrje që përputhet, çka është vërtet e përshtatshme dhe shpesh ngatërrohet me portabilitetin. Zgjedhja është një kërkim, jo një përkthim: nëse varianti mungon, nuk ka asgjë për të zgjedhur. Prandaj e njëjta etiketë në dy hoste mund të japë dy binarë të ndryshëm, dhe në një host nuk jep asgjë të përdorshme.
Fiksimi me digest e heq paqartësinë dhe gjithashtu bën të mundur një rishikim të mëvonshëm, sepse digesti identifikon saktësisht bajtët e testuar. Ruaj atë digest bashkë me regjistrin e vendosjes, në vend që të mbështetesh te etiketa që rastësisht ishte aktuale.
Emulimi është një marrëveshje, jo një shtresë përkthimi
Emulimi përmes një mjedisi të mbështetur ekzekutimi mund të ekzekutojë disa ngarkesa hapësire përdoruesi jo-vendase, prandaj pohimi absolut se një arkitekturë nuk mund të ekzekutojë kurrë imazhin e një tjetre është i gabuar. Nuk është as një zgjidhje e përgjithshme. Ekzekutimi i emuluar ka karakteristika të ndryshme performance, dhe një proces trivial që niset nuk të thotë asgjë nëse një ngarkesë tuneli sillet në mënyrë të pranueshme.
Udhëzuesi shumë-platformësh i Docker i trajton ndërtimet vendase, përpilimin e kryqëzuar dhe emulimin si strategji të veçanta, dhe ky është mënyra e duhur për të lexuar opsionet. Zgjidh një me qëllim dhe kualifiko ngarkesën VPN nën të, në vend që të supozosh ekuivalencë.
Lejet zgjidhin një problem tjetër
Dhënia e një aftësie administrimi rrjeti ose kalimi i një pajisjeje TUN nuk mund ta bëjë një skedar ekzekutues të papajtueshëm të ekzekutohet. Këto janë leje ekzekutimi që përdor një proces në punë; ato janë të padukshme për një ngarkues që e ka refuzuar tashmë skedarin.
E kundërta është po aq e vërtetë. Një binar vendas nuk provon asgjë për privilegjet, aksesin në pajisje, integrimin e resolver-it ose politikën e rinisjes që i nevojitet një tuneli, prandaj një kontejner që niset nuk është ende një kontejner që funksionon. Vendos fillimisht kontratën e platformës, pastaj kalo te kontrata e ekzekutimit me opsionet e saj të dokumentuara.
Mbaj digestin e imazhit, objektivin e mbështetur dhe konfigurimin bashkë në të njëjtin regjistër. Një përditësim etikete që ndryshon në heshtje arkitekturën kapet më lehtë kur digesti i mëparshëm është shënuar, sesa kur simptomi i vetëm është një gabim i njohur dhe një pasdite e re kushtuar korrigjimit.