लेकिन कंटेनर बंद होने पर" निष्पादन "असंभव है, और इस कंटेनर के अंदर कुछ" काम " डेटा भी है, जो उस कमांड के लिए उपयोग किया जाता है, इसलिए मैं उपयोग नहीं कर सकता
docker run ...
हर बार, क्योंकि यह छवि से कंटेनर को फिर से बनाता है और मेरे डेटा को नष्ट कर देता है ।
ऐसे कंटेनर को चलाने के लिए" सही" और "सबसे अच्छा" तरीका क्या है? मैं किस कमांड को अंदर शुरू कर सकता हूं?
चूंकि आपने आवधिक कार्यों का उल्लेख किया है और आप जिस तरह से उपयोग करना चाहते हैं उसके कारण आप शायद क्रॉन जैसे कुछ का उपयोग कर रहे हैं docker exec, मेरे पास आपके लिए सिर्फ दवा है । कम से कम मैंने ऐसा कुछ किया ।
Dockerfile
FROM <some base>CMD tail -f /dev/null
सामान्य के साथ भागो docker run -d .... (मैंने इस्तेमाल किया docker-compose)
मुझे यह समाधान अच्छा लगता है क्योंकि हम एक सुंदर डिफ़ॉल्ट लिनक्स वातावरण में प्राचीन और सिद्ध क्रोंटैब पर भरोसा करते हैं, जबकि डॉकर आपके व्यावसायिक तर्क के अधिक विदेशी डिप्स और पर्यावरण चर को संभालता है । आप कुछ सीमाएँ भी निर्धारित कर सकते हैं यदि आपके आवधिक कार्य अटक जाते हैं और मेमोरी लीक या जो भी हो ।
पूंछ अभी भी समय से कुछ फ़ाइल संचालन का कारण होगा ।
बिना किसी दुष्प्रभाव के हमेशा के लिए सोएं
# Ah, ha, ha, ha, stayin' alive...while :; do :; done & kill -STOP $! && wait $!
यह कैसे काम करता है
while :; # Run an endless loop,do :; # of do nothing,done & # as background task.kill -STOP $! # Stop the background task.wait $! # Wait forever, because background task process has been stopped.
आप एक बंद कंटेनर शुरू कर सकते हैं या नहीं, यह पूरा व्यवसाय इस बात पर निर्भर करता है कि कंटेनर मूल रूप से कैसे बनाया गया था, यानी चलाएं । यदि आप एक कमांड चलाते हैं जो समाप्त हो गया है, या आप एक इंटरैक्टिव कमांड से बाहर निकलते हैं, उदाहरण के लिए बैश, तो आप बंद कंटेनर को शुरू, पुनरारंभ या निष्पादित नहीं कर सकते हैं । आप बस इसे हटा सकते हैं । यह कबाड़ है ।
लेकिन तारानाकी की आखिरी टिप्पणी, '- आईटीडी' का उपयोग करती है, ऐसा लगता है कि डॉकर ने क्या आदेश दिया था ।
कंटेनर चलता रहता है, और आप जो चाहें निष्पादित कर सकते हैं, और आप कंटेनर को रोक, प्रारंभ या पुनरारंभ कर सकते हैं । बेशक, यह अल्पाइन छवि के आधार पर सिर्फ एक प्रारंभिक खोज है । ध्यान दें, यदि आप कंटेनर से जुड़ते हैं, तो बाहर निकलने पर यह बंद हो जाएगा, लेकिन आप इसे फिर से शुरू कर सकते हैं ।
मैंने यहां सभी प्रस्तावित समाधानों का उपयोग स्वयं किया है, लेकिन वे सभी डॉकर डेमॉन से आने वाले सिगटरम संकेतों को संभाल नहीं पाते हैं जब वह कंटेनर को बंद करना चाहता है (जैसे docker stop $containername).
इसलिए मैं निम्नलिखित प्रस्ताव करता हूं:
FROM base:image# ...CMD sh -c 'trap "exit" TERM; while true; do sleep 1; done'
यह मूल रूप से एक छोटी शेल स्क्रिप्ट है जो पहले सिग्टर्म संकेतों को स्वीकार करती है और फिर एक अनंत लूप में एक सेकंड के लिए सो जाती है ।
मैं मुख्य रूप से इसे डॉकर-कंपोज़ के साथ एक साथ उपयोग करता हूं और ophelia किसी अन्य कंटेनर (जैसे मारियाडीबी डेटाबेस) में किसी अन्य सेवा का बैकअप लेने के लिए साइड-कार कंटेनर की आपूर्ति करना ।