کانتینر VPN با 'exec format error' خارج میشود: پلتفرم اشتباه
'exec format error' یعنی باینری برای پردازنده دیگری ساخته شده است، نه اینکه NET_ADMIN کم است. پیش از ویرایش مسیرها یا اطلاعات ورود، فهرست تصویر را بخوانید.
کانتینرهایی که بلافاصله با exec format error خارج میشوند، غریزه نادرست را برمیانگیزند: افزودن یک قابلیت، سوار کردن یک دستگاه، ویرایش پیکربندی تونل. هیچکدام از اینها به مشکل نمیرسد. کرنل اصلاً نتوانست باینری را اجرا کند، که در یک کانتینر تقریباً همیشه یعنی تصویر معماری پردازندهای متفاوت از میزبان را هدف گرفته است. هر چیزی که ممکن است در مسیریابی، اطلاعات ورود یا اختیارات تغییر دهید پس از آغاز یک برنامه رخ میدهد، و هیچ برنامهای آغاز نشد.
پیام آغازینی که شبیه خطای پیکربندی به نظر میرسد
شکست قالب exec از بارگذار میآید، پیش از آنکه برنامه حتی یک تنظیم را بخواند. به همین دلیل هیچ هشدار پیکربندی و هیچ گزارش تونلی تولید نمیکند، چون هیچ فرایند زندهای نیست که آنها را بنویسد. این شکست همچنین بهطور چشمگیری سریع است، اغلب پیش از آنکه حتی یک خط در گزارش کانتینر ظاهر شود. همان پیام کوتاه ظاهر میشود، چه باینری برای معماری دیگری باشد، چه برای سیستمعامل دیگری، چه آسیبدیده باشد.
محیط اجرا و معماری را همراه با ارجاع دقیق تصویر ثبت کنید، سپس بررسی کنید که آن ارجاع واقعاً چه چیزی ارائه میدهد. در Docker Desktop پلتفرم کانتینر به ماشین مجازی لینوکس تعلق دارد نه به لپتاپ، بنابراین معماری میزبان بهتنهایی میتواند گمراهکننده باشد. فهرست ورودیهای ایندکس را برای این ارجاع بخوانید، نه متن بازاریابی صفحه برچسب آن.
پیش از فرمان اجرا، ایندکس تصویر را بخوانید
وقتی یک رجیستری ارجاع چندپلتفرمی منتشر میکند، برچسب به یک ایندکس اشاره میکند و هر ورودی پلتفرمی با خلاصه خودش را نام میبرد. ارجاع مورد بررسی را بازرسی کنید، نه برچسب مجاور را، و ایندکس را بخوانید بهجای آنکه فرض کنید چه دارد.
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 یا سیاست راهاندازی مجددی که یک تونل نیاز دارد اثبات نمیکند، بنابراین کانتینری که آغاز میشود هنوز کانتینری نیست که کار میکند. ابتدا قرارداد پلتفرم را برقرار کنید، سپس با گزینههای مستندش به قرارداد زمان اجرا بروید.
خلاصه تصویر، هدف پشتیبانیشده و پیکربندی را با هم در همان سابقه نگه دارید. بهروزرسانی برچسبی که بیصدا معماری را تغییر میدهد، وقتی خلاصه قبلی نوشته شده باشد آسانتر گرفتنی است تا وقتی تنها نشانه یک خطای آشنا و یک بعدازظهر تازه صرفشده برای اشکالزدایی باشد.