VPN контејнерот излегува со 'exec format error': погрешна платформа
'exec format error' значи дека бинарната датотека е изградена за друг процесор, а не дека недостасува NET_ADMIN. Прочитајте го индексот на сликата пред да уредувате рути или акредитиви.
Контејнерите што веднаш излегуваат со exec format error предизвикуваат погрешен инстинкт: додавање можност, монтирање уред, уредување на конфигурацијата на тунелот. Ниту еден од нив не стигнува до проблемот. Јадрото воопшто не можеше да ја изврши бинарната датотека, што во контејнер речиси секогаш значи дека сликата е насочена кон друга архитектура на процесор од онаа на домаќинот. Сето што би можеле да смените во рутирањето, акредитивите или привилегиите се случува откако програмата ќе започне, а ниту една програма не започна.
Пораката при стартување што изгледа како грешка во конфигурацијата
Неуспехот на форматот exec доаѓа од вчитувачот, пред апликацијата да прочита и едно поставување. Затоа не создава предупредувања за конфигурација ниту дневник на тунелот, бидејќи нема жив процес што би ги запишал. Неуспехот е и извонредно брз, честопати пред воопшто да се појави некој ред во дневникот на контејнерот. Истата кратка порака се појавува без разлика дали бинарната датотека е за друга архитектура, за друг оперативен систем или е оштетена.
Запишете ја околината за извршување и архитектурата заедно со точната референца на сликата, потоа проверете што таа референца навистина нуди. На Docker Desktop платформата на контејнерот и припаѓа на Linux виртуелната машина, а не на преносниот компјутер, па само архитектурата на домаќинот може да заведе. Прочитајте ја листата записи во индексот за оваа референца, а не маркетиншкиот текст на нејзината страница со ознака.
Прочитајте го индексот на сликата пред командата за извршување
Кога регистарот објавува референца за повеќе платформи, ознаката покажува на индекс, и секој запис именува платформа со сопствен digest. Испитајте ја референцата што е предмет на разгледување, а не соседна ознака, и читајте го индексот наместо да претпоставувате што содржи.
docker buildx imagetools inspect ghcr.io/example/vpn:1.4
docker image inspect --format '{{.Os}}/{{.Architecture}}' ghcr.io/example/vpn:1.4
Првата команда ги наведува платформите што ги објавува референцата. Втората известува за платформата на сликата што веќе е присутна локално, и токму неа ќе ја изврши околината за извршување. Референца со само еден запис значи дека секој домаќин добива истата бинарна датотека, а ознаката не може да помогне на машина за која никогаш не била изградена.
Ознаките избираат варијанта; тие не ја создаваат
Индексот за повеќе платформи му овозможува на извршното опкружување да избере соодветен запис, што е навистина практично и често се меша со преносливост. Изборот е пребарување, не превод: ако варијантата недостасува, нема што да се избере. Затоа истата ознака на два домаќини може да резултира со две различни бинарни датотеки, а на еден домаќин не резултира со ништо употребливо.
Прицврстувањето со digest ја отстранува двосмисленоста и исто така овозможува подоцнежен преглед, бидејќи digest точно ги идентификува тестираните бајти. Чувајте го тој digest со записот за распоредување, наместо да се потпирате на ознаката што случајно била актуелна.
Емулацијата е договор, а не слој за превод
Емулацијата преку поддржана околина за извршување може да изврши некои ненативни оптоварувања во корисничкиот простор, па апсолутното тврдење дека една архитектура никогаш не може да изврши слика на друга е погрешно. Таа исто така не е општо решение. Емулираното извршување има различни карактеристики на перформанси, а тривијален процес што започнува не ви кажува ништо за тоа дали оптоварувањето на тунелот се однесува прифатливо.
Docker водичот за повеќе платформи ги третира нативните градби, вкрстената компилација и емулацијата како одделни стратегии, и тоа е правилниот начин да се читаат опциите. Изберете една намерно и оценете го VPN оптоварувањето под неа, наместо да претпоставувате еквивалентност.
Дозволите решаваат друг проблем
Доделувањето можност за администрација на мрежата или пренесувањето на TUN уред не може да натера некомпатибилна извршна датотека да работи. Тоа се дозволи за извршување што ги користи процес во работа; тие се невидливи за вчитувачот што веќе ја одбил датотеката.
Обратното е исто толку точно. Нативната бинарна датотека не докажува ништо за привилегиите, пристапот до уреди, интеграцијата со resolver или политиката за рестартирање што му е потребна на тунелот, затоа контејнерот што започнува сѐ уште не е контејнер што работи. Прво воспоставете го договорот за платформата, потоа преминете на договорот за извршување со неговите документирани опции.
Чувајте го digest на сликата, поддржаната цел и конфигурацијата заедно во истиот запис. Ажурирањето на ознаката што тивко ја менува архитектурата полесно се фаќа кога претходниот digest е запишан, отколку кога единствениот симптом е позната грешка и ново попладне поминато во отстранување грешки.