Кантэйнер VPN выходзіць з 'exec format error': няправільная платформа
'exec format error' азначае, што бінарны файл сабраны для іншага працэсара, а не тое, што не хапае NET_ADMIN. Прачытайце індэкс вобраза, перш чым змяняць маршруты або ўліковыя даныя.
Кантэйнеры, якія адразу выходзяць з 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 не могуць прымусіць несумяшчальны выконваемы файл запусціцца. Гэта правы асяроддзя выканання, якія выкарыстоўвае запушчаны працэс; яны нябачныя для загрузчыка, які ўжо адмовіў у файле.
Адваротнае таксама праўда. Арыгінальны бінарны файл нічога не даказвае пра прывілеі, доступ да прылад, інтэграцыю рэзольвера або палітыку перазапуску, якая патрэбна тунэлю, таму кантэйнер, які запускаецца, яшчэ не кантэйнер, які працуе. Спачатку ўсталюйце кантракт платформы, затым пераходзьце да кантракта асяроддзя выканання з яго дакументаванымі варыянтамі.
Трымайце дайджэст вобраза, падтрымліваную мэту і канфігурацыю разам у адным запісе. Абнаўленне тэга, якое моўчкі змяняе архітэктуру, лягчэй злавіць, калі папярэдні дайджэст запісаны, чым калі адзіны сімптом — знаёмая памылка і свежая пасляабедзенная адладка.