আমি কীভাবে কোনও ডকারের ধারক ঘুমন্ত বন্ধ করতে পারি?


1

sleep অবশ্যই বেশিরভাগ জটিল প্রক্রিয়াগুলির জন্য একটি স্ট্যান্ড-ইন।

এই ডকফাইফাইল (যেমন আপনি এক্সিকিউট ফর্মটি ব্যবহার করে দেখতে পারেন যাতে কেবল একটি প্রক্রিয়া চলছে এবং এর কোনও শিশু নেই bash):

FROM busybox
CMD ["/bin/sleep", "100000"]

একটি নিরবচ্ছিন্ন ধারক তৈরি করে:

docker build -t kill-sleep .
docker run --rm --name kill-sleep kill-sleep

যখন আমি এটি বন্ধ করার চেষ্টা করি:

time docker stop kill-sleep

kill-sleep
real    0m10.449s
user    0m0.021s
sys     0m0.027s

কন্টেইনারটি মারা যাওয়ার আগে কমান্ডটি 10 ​​সেকেন্ডে শেষ হয়।

সমস্যাটি এমন নয় যা sleepসংকেতগুলি পরিচালনা করে না, কারণ যদি আমি এটি হোস্টে চালাই তবে:

sleep 100000
# in another shell
ps faxww | grep sleep
kill -TERM 31333  # the PID

প্রক্রিয়া তত্ক্ষণাত বন্ধ হয়ে যায়।

সমস্যাটি এই পাত্রে পিআইডি 1 হিসাবে চলমান এই বিষয়টি নিয়ে থাকতে পারে তবে আমি এখনও এর জন্য একটি রেফারেন্স ডকুমেন্টেশন দেখতে পাইনি।

উত্তর:


4

যখন আপনি চালাতে docker stop ..., কিছু জিনিস ঘটবে :

  1. dockerধারকটির SIGTERMপ্রধান প্রক্রিয়াতে একটি প্রেরণ করে। প্রক্রিয়াটি একটি মাস্ক / উপেক্ষা করতে সক্ষম হয় SIGTERMএবং যদি এটি হয় (বা এটি শেষ না করে পরিচালনা করে) " কিছুই হবে না "।
  2. একটি সময়সীমা (ডিফল্ট 10 সেকেন্ড) পরে, প্রধান প্রক্রিয়াতে dockerএকটি প্রেরণ SIGKILLকরে। এই সিগন্যালটি কোনও প্রক্রিয়া দ্বারা মুখোশ দেওয়া যায় না, এবং এইভাবে এটি শাটডাউন প্রস্তাবটি কার্যকর করার কোনও সুযোগ ছাড়াই তাত্ক্ষণিকভাবে মারা যায়।

আদর্শভাবে, এগুলির মধ্যে চলমান প্রক্রিয়াগুলি একটি সময়োপযোগী ফ্যাশনে dockerপ্রতিক্রিয়া জানায় SIGTERM, সমাপ্তির আগে কোনও গৃহকর্মের যত্ন নেওয়া।

আপনি যদি জানেন যে প্রক্রিয়াটি হয় কোনও গৃহকর্ম সঞ্চালনের জন্য নেই (যেমন sleep:), বা সঠিকভাবে প্রতিক্রিয়া না জানায় SIGTERM, আপনি -tপতাকাটির সাথে সংক্ষিপ্ত (বা দীর্ঘ) সময়সীমা নির্দিষ্ট করতে পারেন :

-t, --time=10
    Seconds to wait for stop before killing it

উদাহরণস্বরূপ, আপনার ক্ষেত্রে, আপনি চালাতে পছন্দ করতে পারেন docker stop -t 0 ${CONTAINER}


এই সিগন্যাল আচরণটি আলাদা হওয়ার কারণ sleepপিআইডি = 1 দিয়ে চলার কারণ ।

সাধারণত (উদাহরণ: PID, সঙ্গে চললে = 1), কোন সংকেত যে প্রক্রিয়া স্পষ্টভাবে প্রক্রিয়া বিশালাকার সাথে মোকাবিলা নেই সমাপ্ত হচ্ছে - একটি পাঠানোর চেষ্টা sleepএকটি SIGUSR1

তবে, পিআইডি = 1 দিয়ে চলাকালীন, হাতছাড়া হওয়া সংকেতগুলি উপেক্ষা করা হবে, অন্যথায় আপনি কার্নেল আতঙ্কের সাথে শেষ করতে চান:

Kernel panic - not syncing: Attempted to kill init!

আপনি ডকার সরঞ্জামগুলি ব্যবহার করে ডকার পাত্রে একটি সংকেত পাঠাতে পারেন, উদাহরণস্বরূপ:

docker kill -s TERM kill-sleep

আমরা দেখতে পাচ্ছি, এর কাঙ্ক্ষিত প্রভাব নেই, যদিও এর ফলে:

docker kill -s KILL kill-sleep

একটি পরীক্ষা

Dockerfile

FROM busybox
COPY run.sh /run.sh
RUN chmod +x /run.sh
CMD "/run.sh"

run.sh

#!/bin/sh

echo "sleeping"
sleep 100000

এখন, চালান

docker build -t kill-sleep .
docker run --rm --name kill-sleep kill-sleep

এবং এটি একটি ভিন্ন টার্মিনালে:

docker stop kill-sleep

আমরা একই 10 সেকেন্ড বিলম্ব / সময়সীমা পর্যবেক্ষণ করি।

একটি সমাধান

এখন আসুন SIGTERM। Backgrounding এবং waitজন্য ing sleepকিভাবে একটি POSIX শেল সংকেত পরিচালনা কারণে (দেখুন এই বেশি সময় ধরে)।

run.sh

#!/bin/sh

die_func() {
        echo "oh no"
        sleep 2
        exit 1
}
trap die_func TERM

echo "sleeping"
sleep 100000 &
wait

কমান্ডগুলি আবার চালাও, এবং আমরা দেখতে পাচ্ছি আমরা কী করছি!

$ time docker stop kill-sleep
kill-sleep

real    0m2.515s
user    0m0.008s
sys     0m0.044s
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.