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


41

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

हर समय चालू / चालू रहने वाला कोई प्रोग्राम नहीं है।

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

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

तथा

docker exec mysupercont /path/to/myothercommand 

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

docker run ...

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

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


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

1
docker run -d --name=name container tail -f /dev/null
स्टीमपॉवर ने

जवाबों:


46

आपको हर बार प्रदर्शन करने की आवश्यकता नहीं है docker run

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

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

मैं, --interactive = false रखें STDIN खोलने भले ही संलग्न नहीं
आयकर, --tty = false का आवंटन एक छद्म TTY

उदाहरण:

docker run -it debian:stable bash

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

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

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

docker start 1329c99a831b

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

docker attach 1329c99a831b

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


1
अहा, मैं यह समझता हूं। प्रश्न था: मेरे पास कंटेनर के अंदर चलाने के लिए कुछ भी नहीं है, लेकिन मुझे इसे "रन" स्थिति में रखने की आवश्यकता है इसलिए आपका उत्तर है - कंटेनर को चालू स्थिति में रखने के लिए बैश का उपयोग करें?
कोराजविन इवान

हाँ। आप जिस प्रक्रिया को रन टाइम पर निर्दिष्ट करते हैं वह कंटेनर के लिए चल रही होनी चाहिए। सबसे सरल उदाहरण बैश है। शायद आप "-d" के साथ कंटेनर को शुरू करने का सबसे आसान तरीका होगा और इसे आवश्यकतानुसार कनेक्ट कर सकते हैं docker attach ID। इस सत्र से बैश को खत्म किए बिना बाहर निकलें, आप उपयोग कर सकते हैंCTRL-p CTRL-q
MSemochkin

कंटेनर रन के दौरान आपके द्वारा निर्दिष्ट प्रक्रिया PID 1 प्राप्त करती है। तदनुसार, कंटेनर बस इसके बिना काम नहीं कर सकता है
MSemochkin

प्रारंभ और अटैचमेंट (या -ई के साथ शुरू) के साथ मेरा अनुभव यह है कि आपकी कमांड लाइन का शीघ्र और इंटरैक्टिव संपादन नहीं दिखाता है। जैसे tty प्रतिपादन या गूँज नहीं है।
dlamblin

1
यह निफ्टी है। ध्यान दें कि यदि आप बैकग्राउंड में कंटेनर को बिना स्टार्ट किए इसे मैन्युअल रूप से शुरू करना चाहते हैं (जैसे कि यदि आप वेब सेवा चला रहे हैं), तो '-itd' पैरामीटर्स का उपयोग करें, और CTRL-p CTRL-q को बिना रुके अलग करने के लिए। कंटेनर।
तारानकी

6

आप बंद किए गए कंटेनर को शुरू कर सकते हैं या नहीं, यह पूरा व्यवसाय इस बात पर निर्भर करता है कि कंटेनर को मूल रूप से कैसे बनाया गया था, अर्थात। यदि आप एक कमांड चलाते हैं जो समाप्त हो गया है, या आप एक इंटरैक्टिव कमांड से बाहर निकलते हैं, उदाहरण के लिए बैश, तो आप बंद कंटेनर को शुरू, पुनरारंभ या निष्पादित नहीं कर सकते। आप बस इसे हटा सकते हैं। यह कबाड़ है।

लेकिन तरणाकी की अंतिम टिप्पणी, '-dd' का उपयोग करें, ऐसा लगता है कि डॉकटर ने आदेश दिया था।

कंटेनर चलता रहता है, और आप जो चाहें निष्पादित कर सकते हैं, और आप कंटेनर को रोक सकते हैं, शुरू कर सकते हैं या फिर से शुरू कर सकते हैं। बेशक, यह अल्पाइन छवि के आधार पर सिर्फ एक प्रारंभिक खोज है। ध्यान दें, यदि आप कंटेनर से जुड़ते हैं, तो बाहर निकलने पर यह बंद हो जाएगा, लेकिन आप इसे फिर से शुरू कर सकते हैं।


2
+1 "ऐसा लगता है कि डॉकटर ने आदेश दिया" :-)
मैट अलेक्जेंडर

5

चूंकि आपने आवधिक कार्यों का उल्लेख किया है और आप संभवतः क्रोन जैसी किसी चीज का उपयोग कर रहे हैं क्योंकि आप जिस तरह का उपयोग करना चाहते हैं 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
    

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


0

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

यहाँ बिना किसी दुष्प्रभाव के हमेशा के लिए सोने का मेरा उपाय है।

# Ah, ha, ha, ha, stayin' alive...
while true; do :; done & kill -STOP $! && wait $!

यह काम किस प्रकार करता है

while true; do :; done & # do nothing(:) in background, in an endless loop
kill -STOP $!            # stop the background process of doing nothing
wait $!                  # wait forever, because doing nothing process is stopped

1
यह समझना मुश्किल है कि इसका क्या किया जा रहा है। क्यों न सिर्फ 3650d सो जाओ
Pieter

1
आप सही कह रहे हैं, नींद शायद मेरे समाधान के रूप में अच्छी तरह से काम करेगी, हालांकि नींद अंततः बाहर निकल जाएगी: -डी पीएस: मैं अपने समाधान को आसान बनाने के लिए कुछ टिप्पणियां जोड़ूंगा।
qoomon
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.