डॉकर कंटेनर को रखने का सही तरीका तब शुरू हुआ जब यह आवधिक कार्यों के लिए उपयोग किया गया

मेरे पास स्थापित और कॉन्फ़िगर किए गए सॉफ़्टवेयर के साथ डॉकर कंटेनर है ।

वहाँ है कोई किसी भी programm माना जा करने के लिए शुरू कर दिया है/runned सब समय है.

मैं क्या चाहता हूं - बाहरी घटनाओं के आधार पर कुछ कमांड शुरू करने की इसकी क्षमता । जैसे:

docker exec mysupercont /path/to/mycommand -bla -for

और

docker exec mysupercont /path/to/myothercommand 

लेकिन कंटेनर बंद होने पर" निष्पादन "असंभव है, और इस कंटेनर के अंदर कुछ" काम " डेटा भी है, जो उस कमांड के लिए उपयोग किया जाता है, इसलिए मैं उपयोग नहीं कर सकता

docker run ...

हर बार, क्योंकि यह छवि से कंटेनर को फिर से बनाता है और मेरे डेटा को नष्ट कर देता है ।

ऐसे कंटेनर को चलाने के लिए" सही" और "सबसे अच्छा" तरीका क्या है? मैं किस कमांड को अंदर शुरू कर सकता हूं?

आपको हर बार प्रदर्शन करने की ज़रूरत नहीं है docker run.

docker run वास्तव में दो आदेशों का एक क्रम है: "बनाएं" और "प्रारंभ" ।

जब आप कंटेनर चलाते हैं, तो आपको निर्दिष्ट करना होगा "-it":

- मैं, --इंटरएक्टिव=झूठा स्टडिन खुला रखें भले ही संलग्न न हो
-टी, --tty=झूठी आवंटित एक छद्म-TTY

उदाहरण:

docker run -it debian:stable bash

काम पूरा होने के बाद स्टार्टअप पर निर्दिष्ट कमांड (मेरे उदाहरण बैश में) । उदाहरण के लिए, आप "बाहर निकलें"प्रदर्शन करते हैं । कंटेनर बंद हो जाता है:

CONTAINER ID        IMAGE                      COMMAND                CREATED             STATUS                     PORTS               NAMES1329c99a831b        debian:stable              "bash"                 51 seconds ago      Exited (0) 1 seconds ago                       goofy_bardeen

अब आप इसे फिर से शुरू कर सकते हैं

docker start 1329c99a831b

कंटेनर शुरू हो गया है और फिर से "बैश"कमांड निष्पादित करता है ।
कमांड के साथ इस सत्र "बैश" से कनेक्ट करें

docker attach 1329c99a831b

योग करने के लिए: आप के बीच अंतर को समझना होगा run और start कंटेनर।
इसके अलावा, देखो प्रलेखन मापदंडों की भूमिका के लिए "-i t"और"-d"रन"के लिए

चूंकि आपने आवधिक कार्यों का उल्लेख किया है और आप जिस तरह से उपयोग करना चाहते हैं उसके कारण आप शायद क्रॉन जैसे कुछ का उपयोग कर रहे हैं docker exec, मेरे पास आपके लिए सिर्फ दवा है । कम से कम मैंने ऐसा कुछ किया ।

  1. Dockerfile

    FROM <some base>CMD tail -f /dev/null
  2. सामान्य के साथ भागो docker run -d .... (मैंने इस्तेमाल किया docker-compose)

  3. सेटअप होस्ट मशीन क्रोंटैब, उदाहरण के लिए:

    * * * * * docker exec mysupercont foo >> /var/log/foo.log 2>&1* * * * * docker exec mysupercont bar >> /var/log/bar.log 2>&1

मुझे यह समाधान अच्छा लगता है क्योंकि हम एक सुंदर डिफ़ॉल्ट लिनक्स वातावरण में प्राचीन और सिद्ध क्रोंटैब पर भरोसा करते हैं, जबकि डॉकर आपके व्यावसायिक तर्क के अधिक विदेशी डिप्स और पर्यावरण चर को संभालता है । आप कुछ सीमाएँ भी निर्धारित कर सकते हैं यदि आपके आवधिक कार्य अटक जाते हैं और मेमोरी लीक या जो भी हो ।

पूंछ अभी भी समय से कुछ फ़ाइल संचालन का कारण होगा ।

बिना किसी दुष्प्रभाव के हमेशा के लिए सोएं

# 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 किसी अन्य कंटेनर (जैसे मारियाडीबी डेटाबेस) में किसी अन्य सेवा का बैकअप लेने के लिए साइड-कार कंटेनर की आपूर्ति करना ।

डॉकर रन-डी-नाम=नाम कंटेनर पूंछ-एफ / देव/नल

यह एक बहुत अच्छी तरह से समझाया गया प्रश्न है । एक और समान पोस्ट देखेंhere.