Kontena ya VPN inatoka na 'exec format error': jukwaa lisilofaa
'exec format error' inamaanisha binary imeundwa kwa CPU nyingine, si kwamba NET_ADMIN haipo. Soma faharasa ya taswira kabla ya kuhariri njia au vitambulisho.
Kontena zinazotoka mara moja na exec format error huchochea silika isiyofaa: kuongeza uwezo, kuunganisha kifaa, kuhariri usanidi wa handaki. Hakuna hata moja ya haya inayofikia tatizo. Kernel haikuweza kuendesha binary kabisa, jambo ambalo katika kontena karibu kila wakati humaanisha kwamba taswira inalenga usanifu wa CPU tofauti na ule wa mwenyeji. Kila kitu unachoweza kubadilisha katika uelekezaji, vitambulisho au haki hutokea baada ya programu kuanza, na hakuna programu iliyoanza.
Ujumbe wa kuanza unaoonekana kama kosa la usanidi
Kushindwa kwa muundo wa exec huja kutoka kwa kipakiaji, kabla programu haijasoma mpangilio hata mmoja. Ndiyo sababu hakutoi maonyo ya usanidi wala kumbukumbu ya handaki, kwa sababu hakuna mchakato hai wa kuziandika. Kushindwa pia ni haraka sana, mara nyingi kabla ya mstari wowote kuonekana kwenye kumbukumbu ya kontena. Ujumbe huo mfupi huonekana ikiwa binary ni ya usanifu mwingine, ya mfumo mwingine wa uendeshaji, au imeharibika.
Rekodi mazingira ya uendeshaji na usanifu pamoja na rejeleo kamili la taswira, kisha angalia kile rejeleo hilo linatoa kwa kweli. Kwenye Docker Desktop jukwaa la kontena ni la mashine pepe ya Linux na si la kompyuta ndogo, hivyo usanifu wa mwenyeji peke yake unaweza kupotosha. Soma orodha ya maingizo ya faharasa kwa rejeleo hili, si maandishi ya matangazo kwenye ukurasa wake wa lebo.
Soma faharasa ya taswira kabla ya amri ya kuendesha
Rejista inapochapisha rejeleo la majukwaa mengi, lebo huelekeza kwenye faharasa, na kila ingizo hutaja jukwaa lenye digest yake. Kagua rejeleo linalozingatiwa na si lebo jirani, na soma faharasa badala ya kudhani ina nini.
docker buildx imagetools inspect ghcr.io/example/vpn:1.4
docker image inspect --format '{{.Os}}/{{.Architecture}}' ghcr.io/example/vpn:1.4
Amri ya kwanza huorodhesha majukwaa ambayo rejeleo huchapisha. Ya pili huripoti jukwaa la taswira iliyopo tayari ndani, na ndiyo ambayo mazingira ya uendeshaji yataendesha. Rejeleo lenye ingizo moja tu humaanisha kwamba kila mwenyeji hupata binary sawa, na lebo haiwezi kusaidia mashine ambayo haikujengwa kwa ajili yake kamwe.
Lebo huchagua lahaja; hazijitengenezi
Faharasa ya majukwaa mengi huruhusu mazingira ya uendeshaji kuchagua ingizo linalolingana, jambo ambalo kwa kweli ni rahisi na mara nyingi huchanganywa na uwezo wa kuhamishwa. Uchaguzi ni utafutaji, si tafsiri: ikiwa lahaja haipo, hakuna cha kuchagua. Kwa hivyo lebo hiyo hiyo kwa wenyeji wawili inaweza kutoa binary mbili tofauti, na kwa mwenyeji mmoja haitoi chochote kinachoweza kutumika.
Kufunga kwa digest huondoa utata na pia hufanya ukaguzi wa baadaye uwezekane, kwa sababu digest hutambua bayti zilizojaribiwa kwa usahihi. Hifadhi digest hiyo pamoja na rekodi ya usambazaji badala ya kutegemea lebo iliyotokea kuwa ya sasa.
Uigaji ni mpango, si tabaka la tafsiri
Uigaji kupitia mazingira ya uendeshaji yanayoungwa mkono unaweza kuendesha baadhi ya mizigo ya nafasi ya mtumiaji isiyo ya asili, kwa hivyo dai kamili kwamba usanifu mmoja hauwezi kamwe kuendesha taswira ya mwingine si sahihi. Pia si suluhisho la jumla. Utekelezaji ulioigwa una sifa tofauti za utendaji, na mchakato mdogo unaoanza haukuambii chochote kuhusu kama mzigo wa handaki unafanya kazi kwa kukubalika.
Mwongozo wa majukwaa mengi wa Docker huchukulia ujenzi asilia, ukusanyaji mtambuka na uigaji kama mikakati tofauti, na hiyo ndiyo njia sahihi ya kusoma chaguo. Chagua moja kwa makusudi, na tathmini mzigo wa VPN chini yake badala ya kudhani usawa.
Ruhusa hutatua tatizo tofauti
Kutoa uwezo wa utawala wa mtandao au kupitisha kifaa cha TUN hakuwezi kufanya faili tekelezi isiyolingana iendeshe. Hizi ni ruhusa za uendeshaji ambazo mchakato unaoendesha hutumia; hazionekani kwa kipakiaji ambacho tayari kimekataa faili.
Kinyume chake ni kweli vile vile. Binary asilia haithibitishi chochote kuhusu haki, ufikiaji wa kifaa, muunganisho wa resolver au sera ya kuanzisha upya ambayo handaki inahitaji, kwa hivyo kontena inayoanza bado si kontena inayofanya kazi. Anzisha mkataba wa jukwaa kwanza, kisha nenda kwenye mkataba wa uendeshaji pamoja na chaguo zake zilizoandikwa.
Hifadhi digest ya taswira, lengo linaloungwa mkono na usanidi pamoja katika rekodi moja. Sasisho la lebo linalobadilisha usanifu kwa utulivu ni rahisi kugundua wakati digest ya awali imeandikwa, kuliko wakati dalili pekee ni kosa linalojulikana na mchana mpya uliotumika katika utatuzi wa hitilafu.