Docker Run থেকে Compose

একটি docker run কমান্ড পেস্ট করুন এবং একটি ব্যবহারযোগ্য Compose সার্ভিস ডেফিনিশন পান: পোর্ট, ভলিউম, এনভায়রনমেন্ট, নেটওয়ার্ক, healthcheck এবং restart পলিসি, আপনার ব্রাউজারে রূপান্তরিত।

একটি দীর্ঘ docker run কমান্ডকে একটি Compose ফাইলে পরিণত করুন যা আপনি কমিট করতে পারেন। আপনি যেভাবে টাইপ করবেন ঠিক সেভাবে কমান্ডটি পেস্ট করুন, লাইন কন্টিনিউয়েশনসহ। Compose-এর সমতুল্য নেই এমন ফ্ল্যাগগুলো নীরবে বাদ না দিয়ে নোট হিসেবে তালিকাভুক্ত হয়।

অ্যাডহক কমান্ড থেকে পুনরুৎপাদনযোগ্য ফাইল

রূপান্তর কেন সম্পূর্ণ যান্ত্রিক নয়

একটি docker run কমান্ড এবং একটি Compose সার্ভিস একই কন্টেইনার বর্ণনা করে, তবে তারা ভিন্ন প্রশ্নের উত্তর দেয়। কমান্ডটি বলে এখন কী করতে হবে। ফাইলটি বলে এই সার্ভিসটি চলার সময় সবসময় কী সত্য হওয়া উচিত। বেশিরভাগ ফ্ল্যাগ পরিষ্কারভাবে মানচিত্রে আঁকা হয় এবং যেগুলো আঁকা হয় না সেগুলো প্রায় সবসময়ই রান করার ক্রিয়াটি বর্ণনা করে, কন্টেইনার নিজেই নয়।

সবচেয়ে পরিষ্কার উদাহরণ হলো detach। -d লেখার অর্থ ডেমন আপনার টার্মিনাল ধরে রাখবে না, যা সেই ইনভোকেশনের একটি বৈশিষ্ট্য, সার্ভিসের নয়। Compose-এ একই উদ্দেশ্য কমান্ড লাইনে docker compose up -d দিয়ে প্রকাশ করা হয়, তাই ফ্ল্যাগটি ফাইল থেকে কেবল অদৃশ্য হয়ে যায়। একই কথা প্রযোজ্য --rm-এর ক্ষেত্রে, যা এই নির্দিষ্ট রানের পরে পরিষ্কার করার অনুরোধ করে; Compose সমতুল্য হলো আপনি শেষ করলে docker compose down চালানো।

ইন্টারেক্টিভ ফ্ল্যাগগুলো মাঝখানে থাকে। -i এবং -t উভয়েরই Compose কী আছে, stdin_open এবং tty, কারণ একটি শেল সংযুক্ত রাখা একটি সার্ভিসের প্রকৃত বৈশিষ্ট্য হতে পারে। এগুলো বাদ না দিয়ে রূপান্তরিত হয়, যদিও বেশিরভাগ দীর্ঘ-চলমান সার্ভিসের প্রয়োজন হয় না।

কোটিং যেখানে রূপান্তর ভেঙে যায়

একটি ভাঙা রূপান্তরের সবচেয়ে সাধারণ কারণ হলো কমান্ডটি পেস্ট করার আগে হারিয়ে যাওয়া একটি শেল কোটা। একটি healthcheck বিবেচনা করুন: পুরো টেস্ট কমান্ডটিকে একটি আর্গুমেন্ট হিসাবে পৌঁছাতে হয়, যার জন্যই এটি কমান্ড লাইনে কোটা দিয়ে মোড়ানো থাকে। কোটাসহ না পেস্ট করলে শব্দগুলো আলাদা আর্গুমেন্ট হয়ে যায়, ইমেজ নাম ভুল অবস্থান থেকে পড়া হয় এবং ফলাফল অর্থহীন হয়।

কনভার্টারটি ইনপুটকে একটি শেল যেভাবে টোকেনাইজ করবে সেভাবে টোকেনাইজ করে, সিঙ্গেল কোটা, ডাবল কোটা, ব্যাকস্ল্যাশ এসকেপ এবং ব্যাকস্ল্যাশ-নিউলাইন কন্টিনিউয়েশন সম্মান করে, তাই একটি স্ক্রিপ্ট থেকে সরাসরি কপি করা কমান্ড তার কাঠামো ধরে রাখে। তারপর এটি YAML নিয়ম অনুযায়ী মানগুলোকে পুনরায় কোটা করে, যা লোকেরা যতটা আশা করে তার চেয়ে বেশি গুরুত্বপূর্ণ। 8080:80-এর মতো একটি পোর্ট ম্যাপিং YAML-এ কোটা করা আবশ্যক, কারণ কোটা ছাড়া একটি কোলন-বিচ্ছিন্ন জোড়া অস্পষ্ট এবং পুরনো পার্সাররা ঐতিহাসিকভাবে 22:00-এর মতো মানকে সেক্সাজেসিমাল সংখ্যা হিসেবে পড়েছে।

নেটওয়ার্ক এবং ফাইল যা জানতে পারে না

নেটওয়ার্ক হ্যান্ডলিং হলো একমাত্র জায়গা যেখানে বিশ্বস্ত রূপান্তরেও আপনার একটি সিদ্ধান্ত প্রয়োজন। কমান্ডটি host, none বা bridge-এ যোগ দিলে, এটি একটি মোড এবং network_mode হয়ে যায়। অন্য যেকোনো নাম একটি বিদ্যমান নেটওয়ার্ককে নির্দেশ করে, তাই সার্ভিসটি একটি networks এন্ট্রি পায় এবং ফাইলটি সেই নেটওয়ার্কটিকে external হিসেবে ঘোষণা করে।

সেই ঘোষণা আপনার পরিবেশ সম্পর্কে একটি বিবৃতি: এটি বলে নেটওয়ার্কটি এই ফাইলের বাইরে পরিচালিত হয়। আপনি বরং Compose নেটওয়ার্ক তৈরি ও মালিকানা করুক চাইলে, external ফ্ল্যাগটি মুছে ফেলুন এবং এটি স্বাভাবিকভাবে সংজ্ঞায়িত হতে দিন। কনভার্টার বলতে পারে না আপনি কোনটি চান, কারণ মূল কমান্ডটি শুধুমাত্র প্রমাণ করে যে নেটওয়ার্কটি এটি চলার মুহূর্তে বিদ্যমান ছিল।

একই সতর্কতা bind মাউন্টের ক্ষেত্রে প্রযোজ্য। /srv/site-এর মতো একটি পাথ সেই মেশিনে কাজ করে যেখানে কমান্ডটি লেখা হয়েছিল এবং অন্য কোথাও নয়। সার্ভিসটি একবার কমিট করা এবং শেয়ার করা একটি ফাইলে থাকলে, আপেক্ষিক পাথ বা নামযুক্ত ভলিউম সাধারণত ভালো পছন্দ।

হাতে লেখা শেল টোকেনাইজার এবং YAML রাইটার দিয়ে অভ্যন্তরীণভাবে নির্মিত। কোনো তৃতীয়-পক্ষের পার্সার বান্ডল করা হয়নি এবং আপনার কমান্ড কখনো ব্রাউজার ছেড়ে যায় না।

সচরাচর জিজ্ঞাসিত প্রশ্ন

কেন -d ফ্ল্যাগটি আউটপুট থেকে অদৃশ্য হয়ে গেল?
Detach বর্ণনা করে আপনি কীভাবে একটি কন্টেইনার শুরু করেন, কন্টেইনারটি কী তা নয়। Compose-এ আপনি docker compose up -d চালিয়ে একই জিনিস প্রকাশ করেন, তাই এটি ফাইলের অন্তর্গত নয়।
আমি কি ব্যাকস্ল্যাশসহ একটি বহু-লাইন কমান্ড পেস্ট করতে পারি?
হ্যাঁ। পার্স করার আগে ব্যাকস্ল্যাশ-নিউলাইন কন্টিনিউয়েশনগুলো যুক্ত হয়, তাই আপনি পুনরায় ফরম্যাট না করে একটি শেল স্ক্রিপ্ট বা ডকুমেন্টেশন থেকে সরাসরি একটি কমান্ড কপি করতে পারেন।
আমার পোর্টগুলো কেন কোটা দিয়ে মোড়ানো?
YAML একটি কোটা ছাড়া কোলন-বিচ্ছিন্ন জোড়াকে অস্পষ্ট হিসেবে গণ্য করে এবং কিছু পার্সার 22:00-এর মতো মানকে সংখ্যা হিসেবে পড়ে। পোর্ট ম্যাপিং কোটা করা সেগুলোকে সঠিক রাখার নথিভুক্ত উপায়।
জেনারেটেড নেটওয়ার্কে external: true এর অর্থ কী?
এটি Compose-কে জানায় নেটওয়ার্কটি ইতিমধ্যে বিদ্যমান এবং এই ফাইল দ্বারা তৈরি বা অপসারণ করা উচিত নয়। আপনি চাইলে Compose নিজেই নেটওয়ার্ক পরিচালনা করুক, সেই ফ্ল্যাগটি মুছে ফেলুন।
অসমর্থিত ফ্ল্যাগগুলো কি নীরবে উপেক্ষা করা হয়?
না। কনভার্টার যা ম্যাপ করতে পারে না তা রূপান্তর নোটের অধীনে তালিকাভুক্ত হয় যাতে আপনি এটির সাথে কী করবেন তা সিদ্ধান্ত নিতে পারেন, পরে বাদ পড়া আবিষ্কার করার পরিবর্তে।
আমার কমান্ড কি কোথাও আপলোড হয়?
না। পার্সিং এবং YAML জেনারেশন উভয়ই হাতে লেখা কোড দিয়ে আপনার ব্রাউজারে চলে, তাই কমান্ডটি কখনো পেজ ছেড়ে যায় না।