যখন আপনি চালাতে docker stop ...
, কিছু জিনিস ঘটবে :
docker
ধারকটির SIGTERM
প্রধান প্রক্রিয়াতে একটি প্রেরণ করে। প্রক্রিয়াটি একটি মাস্ক / উপেক্ষা করতে সক্ষম হয় SIGTERM
এবং যদি এটি হয় (বা এটি শেষ না করে পরিচালনা করে) " কিছুই হবে না "।
- একটি সময়সীমা (ডিফল্ট 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