ডকার সিএমডি নির্দেশনায় একাধিক কমান্ড


39

আমি time ডকফাইফিলের সিএমডি নির্দেশের মাধ্যমে রানটাইমে দুটি কমান্ড কার্যকর করার চেষ্টা করলে কী ঘটছে তা বুঝতে পারছি না। আমি ধরে নিয়েছি যে এটি কাজ করা উচিত:

CMD ["/etc/init.d/nullmailer", "start", ";", "/usr/sbin/php5-fpm"]

কিন্তু এটি কাজ করছে না। ধারক শুরু হয়নি। সুতরাং আমাকে এটি এইভাবে করতে হয়েছিল:

CMD ["sh", "-c", "/etc/init.d/nullmailer start ; /usr/sbin/php5-fpm"]

আমি বুঝতে পারছি না। কেন এমন? কেন প্রথম লাইনটি সঠিক উপায়ে নয়? কেউ আমাকে এই "সিএমডি শেল ফর্ম্যাট বনাম জেএসওএন ফর্ম্যাট ইত্যাদি" বিষয়গুলি ব্যাখ্যা করতে পারেন? সহজ কথায়।

কেবল লক্ষণীয় - যেমনটি প্রত্যাশার সাথে command:নির্দেশনাও ছিল docker-compose.yml

উত্তর:


33

আমি বিশ্বাস করি যে পার্থক্যটির সাথে সম্পর্ক থাকতে পারে, দ্বিতীয় কমান্ড শেল প্রসেসিং করে, যখন প্রথমটি করে না। অফিসিয়াল ডকুমেন্টেশন অনুসারে , execএবং shellফর্মটি রয়েছে, আপনার প্রথম কমান্ড একটি এক্সিকিউটিভ ফর্ম এবং এটি উদাহরণস্বরূপ পরিবেশের পরিবর্তনশীলগুলি প্রসারিত করে না, যখন দ্বিতীয়টি করে। সুতরাং এটি সম্ভব যে, এক্সিকিউট ফর্মটি ব্যবহার করে শেল প্রসেসিংয়ের উপর নির্ভরতার কারণে কমান্ডটি ব্যর্থ হতে পারে। আপনি এটি চালিয়ে পরীক্ষা করতে পারেনdocker logs CONTAINERID

আপনার দ্বিতীয় কমান্ড শেল ফর্মটি সমান -

CMD /etc/init.d/nullmailer start ; /usr/sbin/php5-fpm

ডকুমেন্টেশন থেকে অংশগুলি -

দ্রষ্টব্য: শেল ফর্মের বিপরীতে, এক্সিকিউটিভ ফর্মটি কমান্ড শেলকে ডাকে না। এর অর্থ হ'ল স্বাভাবিক শেল প্রসেসিং হয় না। উদাহরণস্বরূপ, CMD [ "echo", "$HOME" ]চলক বিকল্প পরিবর্তন করবেন না $HOME। আপনি শেল প্রক্রিয়াকরণ চান তাহলে হয় শেল ফর্ম ব্যবহার করুন অথবা উদাহরণস্বরূপ সরাসরি একটি শেল চালানো: CMD [ "sh", "-c", "echo", "$HOME" ]


পরিবেশের ভেরিয়েবলের কারণে সম্ভবত কমান্ড ব্যর্থ হয়েছিল। execএটি এখনও পছন্দসই ফর্ম হিসাবে আমার এই ফর্মটি ব্যবহার করা উচিত ? কেন এটি পছন্দ? অথবা আমি সহজ shellফর্ম ব্যবহার করা উচিত ?
ভ্লাদান

এটি ব্যর্থ হয়েছে কারণ একের পর এক কমান্ড চালানো শেল ফাংশন। পরিবেশের ভেরিয়েবলগুলি একটি লাল রঙের হারিং ring
ব্রায়ান

আপনি যদি ডকারে একাধিক পরিষেবা চালাচ্ছেন তবে আমি সুপারভাইজারের মতো একটি প্রক্রিয়া পরিচালক ব্যবহার করার পরামর্শ দেব। আপনি সিএমডি বিভাগের অধীনে কেবল তত্ত্বাবধায়ক চালু করেন এবং পরিষেবাগুলি শুরু করার ক্ষেত্রে এটি যত্ন নেবে। আপনি বিশদটি এখানে পরীক্ষা করতে পারেন - ডকস.ডোকার.আর্টিকেলস
ড্যানিয়েল টি।

আমি ঠিক পড়ছিলাম এটি একটি নিখুঁত নিবন্ধ :) ধন্যবাদ।
ভ্লাদান

আপনার এখনও কেন দরকার তা আমি এখনও বুঝতে পারি না CMD [ "sh", "-c", "echo", "$HOME"]CMD ["sh", "-c", "echo $HOME"]বা কেন , এই বিষয়ে CMD ["sh -c echo $HOME"],?
ষাট

4

নিজের উপর এটিকে শক্ত করবেন না। কেবল "স্টার্ট.শ" বাশ ফাইল তৈরি করুন:

#!/bin/bash

/usr/bin/command2 param1
/usr/bin/commnad1

আপনার ডকফায়াইলে করুন:

ADD start.sh /

CMD ["/start.sh"]

2

এর JSON সিনট্যাক্স CMD(এবং RUNএবং ENTRYPOINT) একটি Exec প্রাপ্ত syscall সরাসরি কার্নেল আর্গুমেন্ট পাস। এক্সিকিউটি সিস্টেমে কমান্ডকে ফাঁক দিয়ে ফাঁকে ফাঁকে ফাঁকে পাওয়া, আইও পুনঃনির্দেশকরণ, পরিবর্তনশীল প্রতিস্থাপন, কমান্ডগুলির মধ্যে পাইপিং, একাধিক কমান্ড চালানো ইত্যাদি ইত্যাদি নেই from সিস্কেল কেবল চালানোতে এক্সিকিউটেবল এবং সেই নির্বাহযোগ্যকে প্রেরণের জন্য আর্গুমেন্টের তালিকা গ্রহণ করে এবং এটি এটি চালায়।

অক্ষরগুলি $ভেরিয়েবলগুলি প্রসারিত করা, ;পৃথক কমান্ড, (স্পেস) পৃথক যুক্তি, &&এবং ||চেইন কমান্ডগুলি, >আউটপুট পুনর্নির্দেশের জন্য, |কমান্ডগুলির মধ্যে পাইপ ইত্যাদির মতো সমস্ত শেলের বৈশিষ্ট্য এবং সেগুলির ব্যাখ্যা /bin/shবা /bin/bashবাস্তবায়ন করার মতো কিছু দরকার ।


আপনি যদি স্ট্রিং সিনট্যাক্সে স্যুইচ করেন তবে CMDডকার আপনার কমান্ডটি শেল দিয়ে চালাবে:

CMD /etc/init.d/nullmailer start ; /usr/sbin/php5-fpm

অন্যথায়, আপনার দ্বিতীয় বাক্য গঠন ঠিক একই জিনিসটি করে:

CMD ["sh", "-c", "/etc/init.d/nullmailer start ; /usr/sbin/php5-fpm"]

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

CMD /etc/init.d/nullmailer start ; exec /usr/sbin/php5-fpm

যাইহোক, প্লেগ্রাউন্ডে নিঃশব্দে ব্যর্থ হওয়া হ্যান্ডলিং প্রক্রিয়াগুলির জন্য আপনাকে সুপারভাইজারের মতো একধরণের মাল্টি-প্রসেস ম্যানেজারে স্যুইচ করতে হবে, বা আপনার অ্যাপ্লিকেশনটিকে একাধিক পাত্রে ব্রেক করা এবং ডকার-রচনার মতো কিছু দিয়ে তাদের স্থাপন করা দরকার।


1

আমার ধারণা প্রথম কমান্ডটি ব্যর্থ হয়েছে কারণ ডকার সিএমডি ফর্মে কেবলমাত্র প্রথম প্যারামিটারটি কার্যকর করা হয়, বাকিটি এই কমান্ডটিতে খাওয়ানো হয়।

দ্বিতীয় ফর্মটি কাজ করে কারণ সমস্ত কমান্ডগুলি ";" দিয়ে বিচ্ছিন্ন হয়; sh কমান্ডে খাওয়ানো হয়, যা তাদের কার্যকর করে।


1

আমি মনে করি না "শুরু" এর পরে আপনার আধা কমা করা উচিত

পরিবর্তে ব্যবহার

CMD ["/etc/init.d/nullmailer", "start", ";", "/usr/sbin/php5-fpm"]

চেষ্টা

CMD ["/etc/init.d/nullmailer", "start", "/usr/sbin/php5-fpm"]

যেমন ডকার "sh -c" ব্যবহার করে, উপরের কমান্ডটি নীচের মত কার্যকর হবে

/etc/init.d/nullmailer start
/etc/init.d/nullmailer /usr/sbin/php5-fpm

জসন সিনট্যাক্স শেল দিয়ে কমান্ডগুলি চালায় না sh -c, সেই পরিস্থিতিতে নেই।
বিএমইচ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.