যে কন্টেইনারগুলো সঙ্গে সঙ্গে exec format error নিয়ে বন্ধ হয়ে যায়, তারা ভুল প্রবৃত্তি জাগায়: একটি ক্যাপাবিলিটি যোগ করা, একটি ডিভাইস মাউন্ট করা, টানেল কনফিগারেশন সম্পাদনা করা। এর কোনোটিই সমস্যাটিতে পৌঁছায় না। কার্নেল বাইনারিটি একেবারেই চালাতে পারেনি, যার অর্থ কন্টেইনারে প্রায় সবসময়ই ইমেজটি হোস্টের চেয়ে ভিন্ন CPU আর্কিটেকচারের জন্য লক্ষ্য করা। রাউটিং, ক্রেডেনশিয়াল বা বিশেষাধিকার সম্পর্কে আপনি যা কিছু বদলাতে পারেন, তা ঘটে একটি প্রোগ্রাম চালু হওয়ার পরে, আর কোনো প্রোগ্রামই চালু হয়নি।

শুরুর বার্তাটি যা কনফিগারেশন ত্রুটির মতো দেখায়

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 ডিভাইস পাস করা একটি অসামঞ্জস্যপূর্ণ এক্সিকিউটেবল চালু করাতে পারে না। এগুলো রানটাইম অনুমতি যা একটি চলমান প্রক্রিয়া ব্যবহার করে; যে লোডার ইতিমধ্যে ফাইলটি প্রত্যাখ্যান করেছে তার কাছে এগুলো অদৃশ্য।

উল্টোটিও সমানভাবে সত্য। একটি নেটিভ বাইনারি বিশেষাধিকার, ডিভাইস অ্যাক্সেস, রিজলভার ইন্টিগ্রেশন বা টানেলের প্রয়োজনীয় রিস্টার্ট নীতির বিষয়ে কিছুই প্রমাণ করে না, তাই চালু হওয়া একটি কন্টেইনার এখনো কাজ করা কন্টেইনার নয়। প্রথমে প্ল্যাটফর্ম চুক্তি প্রতিষ্ঠা করুন, তারপর এর নথিভুক্ত বিকল্পগুলো নিয়ে রানটাইম চুক্তিতে যান।

ইমেজ ডাইজেস্ট, সমর্থিত টার্গেট ও কনফিগারেশন একসঙ্গে একই রেকর্ডে রাখুন। নীরবে আর্কিটেকচার বদলে দেওয়া একটি ট্যাগ আপডেট ধরা সহজ হয় যখন আগের ডাইজেস্ট লেখা থাকে, তুলনায় যখন একমাত্র উপসর্গ একটি পরিচিত ত্রুটি এবং ডিবাগিংয়ের পেছনে খরচ হওয়া নতুন এক বিকেল।

সম্পর্কিত নিবন্ধ