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

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

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, প্রত্যাশিত হিসাবে.

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

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

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

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

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

নিজের উপর এটা কঠিন না. শুধু একটি ব্যাশ ফাইল তৈরি করুন;শুরু করুন;:

#!/bin/bash/usr/bin/command2 param1/usr/bin/command1

আপনার ডকফিলে করবেন:

ADD start.sh /RUN chmod +x /start.shCMD ["/start.sh"]

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

মত অক্ষর $ ভেরিয়েবল প্রসারিত করতে, ; কমান্ড পৃথক করতে, (স্থান) আর্গুমেন্ট পৃথক করতে, && এবং || চেইন কমান্ড, > আউটপুট পুনঃনির্দেশ জন্য, | কমান্ড ইত্যাদির মধ্যে পাইপ করা শেলের সমস্ত বৈশিষ্ট্য এবং এর মতো কিছু প্রয়োজন /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

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

আমি অনুমান প্রথম কমান্ড ব্যর্থ কারণ ডকার সিএমডি ফর্ম, শুধুমাত্র প্রথম প্যারামিটার মৃত্যুদন্ড কার্যকর করা হয়, বাকি এই কমান্ডের মধ্যে খাওয়ানো হয়.

দ্বিতীয় ফর্মটি কাজ করে কারণ সমস্ত কমান্ড পৃথক"; " এসএইচ কমান্ডে খাওয়ানো হয়, যা তাদের কার্যকর করে

উদাহরণস্বরূপ, কল্পনা করুন আপনার চালানোর জন্য দুটি পাইথন কমান্ড রয়েছে python init_reset.py এবং python app.py. তারপরে সিএমডি ব্যবহার করে আপনি দুটি কমান্ডকে একক কমান্ডের সাথে একত্রিত করতে পারেন

CMD python init_reset.py ; python app.py

ডকার রচনায় এটি নিম্নলিখিত উদাহরণ হিসাবে করা যেতে পারে:

command: ["sh", "-c", "    apt update && apt install -y libldap-common;    cp /ca.crt /usr/local/share/ca-certificates/;    update-ca-certificates;    exec apache2-foreground  "]

দ্য exec প্রধান নির্বাহযোগ্য প্রসঙ্গটি অ্যাপাচে স্যুইচ করবে 2-ফোরগ্রাউন্ড.

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

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

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

চেষ্টা করুন

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

ডকার যেমন "এসএইচ-সি" ব্যবহার করে, উপরের কমান্ডটি নীচের মতো কার্যকর করা হবে

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