Контейнери, които излизат веднага с exec format error, подтикват към грешен инстинкт: да добавите възможност, да монтирате устройство, да редактирате конфигурацията на тунела. Нищо от това не стига до проблема. Ядрото изобщо не е успяло да изпълни двоичния файл, което в контейнер почти винаги означава, че образът е насочен към различна процесорна архитектура от тази на хоста. Всичко, което бихте променили по маршрути, идентификационни данни или привилегии, се случва след като програма е стартирала, а нито една програма не е стартирала.

Стартовото съобщение, което изглежда като грешка в конфигурацията

Отказът на формат exec идва от зареждащия модул, преди приложението да прочете дори една настройка. Затова той не дава предупреждения за конфигурацията и не оставя лог на тунела, защото няма жив процес, който да ги запише. Отказът е и забележително бърз, често преди да се появи дори ред в лога на контейнера. Същото кратко съобщение се появява независимо дали двоичният файл е за друга архитектура, за друга операционна система или е повреден.

Запишете средата за изпълнение и архитектурата заедно с точната референция на образа, след което проверете какво всъщност предлага тази референция. В Docker Desktop платформата на контейнера принадлежи на виртуалната машина с Linux, а не на лаптопа, така че само архитектурата на хоста може да подведе. Прочетете списъка със записи в индекса за тази референция, вместо маркетинговия текст на страницата на етикета.

Прочетете индекса на образа преди командата за стартиране

Когато регистър публикува мултиплатформена референция, етикетът сочи към индекс и всеки запис посочва платформа със собствен дайджест. Инспектирайте разглежданата референция, а не съседен етикет, и четете индекса, вместо да предполагате какво съдържа.

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

Първата команда изброява платформите, които референцията публикува. Втората отчита платформата на образа, който вече е наличен локално, а именно него ще изпълни средата за изпълнение. Референция само с един запис означава, че всеки хост получава същия двоичен файл и етикетът не може да помогне на машина, за която никога не е бил създаден.

Етикетите избират вариант; те не го създават

Мултиплатформен индекс позволява на средата за изпълнение да избере подходящ запис, което е наистина удобно и често се бърка с преносимост. Изборът е справка, а не превод: ако вариантът липсва, няма какво да се избере. Затова един и същ етикет на два хоста може да се разреши до два различни двоични файла, а на един хост — до нищо използваемо.

Закрепването по дайджест премахва двусмислието и също прави възможен по-късен преглед, защото дайджестът идентифицира точно байтовете, които са тествани. Пазете този дайджест заедно със записа за внедряване, вместо да разчитате на етикета, който случайно е бил актуален.

Емулацията е уговорка, а не слой за превод

Емулацията чрез поддържана среда за изпълнение може да изпълнява някои неродни натоварвания в потребителското пространство, така че абсолютното твърдение, че една архитектура никога не може да изпълни образа на друга, е погрешно. Това също не е общо решение. Емулираното изпълнение има различни характеристики на производителност и тривиален процес, който стартира, не ви казва нищо за това дали натоварването на тунела се държи приемливо.

Мултиплатформеното ръководство на Docker разглежда родните билдове, крос-компилацията и емулацията като отделни стратегии и това е правилният начин да се четат опциите. Изберете една съзнателно и квалифицирайте натоварването на VPN под нея, вместо да предполагате еквивалентност.

Правата решават друг проблем

Предоставянето на възможност за администриране на мрежата или предаването на TUN устройство не може да накара несъвместим изпълним файл да работи. Това са права за средата за изпълнение, които използва работещ процес; те са невидими за зареждащ модул, който вече е отказал файла.

Обратното е също толкова вярно. Родният двоичен файл не доказва нищо за привилегии, достъп до устройства, интеграция с resolver или политиката за рестартиране, която тунелът изисква, така че контейнер, който стартира, все още не е контейнер, който работи. Установете първо договора за платформата, след което преминете към договора за средата за изпълнение с неговите документирани опции.

Пазете дайджеста на образа, поддържаната цел и конфигурацията заедно в един запис. Актуализация на етикет, която тихо променя архитектурата, е по-лесна за улавяне, когато предишният дайджест е записан, отколкото когато единственият симптом е позната грешка и нов следобед за отстраняване на проблеми.

Подобни статии