Контейнери, які одразу завершуються з 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 не може змусити несумісний виконуваний файл працювати. Це права середовища виконання, які використовує працюючий процес; вони невидимі для завантажувача, який уже відмовив файлу.

Зворотне так само правильне. Рідний двійковий файл нічого не доводить щодо привілеїв, доступу до пристроїв, інтеграції резолвера чи політики перезапуску, яка потрібна тунелю, тому контейнер, який запускається, ще не контейнер, який працює. Спершу встановіть контракт платформи, а потім переходьте до контракту виконання з його задокументованими опціями.

Зберігайте дайджест образу, підтримувану ціль і конфігурацію разом у тому самому записі. Оновлення тегу, яке тихо змінює архітектуру, легше зловити, коли попередній дайджест записано, ніж коли єдиний симптом — знайома помилка та новий день, витрачений на налагодження.

Схожі статті