VPN کنٹینر 'exec format error' کے ساتھ بند ہو جاتا ہے: غلط پلیٹ فارم
'exec format error' کا مطلب ہے کہ بائنری کسی دوسرے CPU کے لیے بنائی گئی ہے، نہ کہ NET_ADMIN غائب ہے۔ راستے یا اسناد میں ترمیم سے پہلے امیج انڈیکس پڑھیں۔
جو کنٹینر فوراً exec format error کے ساتھ بند ہو جاتے ہیں، وہ غلط فطرت کو ابھارتے ہیں: کوئی صلاحیت شامل کرنا، کوئی آلہ ماونٹ کرنا، ٹنل کنفیگریشن میں ترمیم کرنا۔ ان میں سے کوئی بھی مسئلے تک نہیں پہنچتا۔ کرنل بائنری کو بالکل چلا نہیں سکا، جس کا کنٹینر میں تقریباً ہمیشہ مطلب یہ ہوتا ہے کہ امیج میزبان سے مختلف CPU آرکیٹیکچر کو نشانہ بناتی ہے۔ راستہ بندی، اسناد یا مراعات میں آپ جو کچھ بھی بدل سکتے ہیں وہ پروگرام شروع ہونے کے بعد ہوتا ہے، اور کوئی پروگرام شروع نہیں ہوا۔
شروع ہونے کا پیغام جو کنفیگریشن کی غلطی جیسا لگتا ہے
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 لکھا ہوا ہو، بجائے اس کے کہ واحد علامت کوئی مانوس خرابی اور ڈیبگنگ میں گزاری گئی نئی دوپہر ہو۔