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


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

हर समय कोई प्रोग्राम शुरू नहीं किया जाना चाहिए / चलाने के लिए कोई प्रोग्राम नहीं है।

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

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

तथा

docker exec mysupercont /path/to/myothercommand 

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

docker run ...

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

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


36
2018-01-23 16:24


मूल


यह एक बहुत अच्छी तरह से समझाया गया सवाल है। एक और समान पोस्ट देखें यहाँ। - Grant Li
docker run -d --name=name container tail -f /dev/null - steampowered


जवाब:


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

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

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

-i, --interactive = झूठी संलग्न होने पर भी STDIN खोलें
  -t, --tty = झूठी एक छद्म-टीटीई आवंटित करें

उदाहरण:

docker run -it debian:stable 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"रन" के लिए


42
2018-01-27 05:04



आह, मैं इसे समझता हूँ। प्रश्न था: मेरे पास कंटेनर के अंदर चलाने के लिए कुछ भी नहीं है, लेकिन मुझे इसे "रन" स्थिति में रखना होगा, इसलिए आपका जवाब है - कंटेनर को चलने वाले राज्य में रखने के लिए बैश का उपयोग करें? - Korjavin Ivan
हां। प्रक्रिया जिसे आपने रन टाइम पर निर्दिष्ट किया है, कंटेनर पर काम करना जारी रखना चाहिए। सबसे सरल उदाहरण है बैश। शायद आप "-d" के साथ कंटेनर शुरू करने का सबसे आसान तरीका होंगे और इसका उपयोग करके आवश्यकतानुसार कनेक्ट होंगे docker attach ID। बैश समाप्त किए बिना इस सत्र से बाहर निकलें, आप इसका उपयोग कर सकते हैं CTRL-p CTRL-q - MSemochkin
कंटेनर रन के दौरान निर्दिष्ट प्रक्रिया पीआईडी ​​प्राप्त करती है 1. तदनुसार, कंटेनर बस इसके बिना काम नहीं कर सकता है - MSemochkin
स्टार्ट और अटैच (या वाई के साथ शुरू) के साथ मेरा अनुभव यह है कि आपकी कमांड लाइन का त्वरित और इंटरैक्टिव संपादन प्रदर्शित नहीं होता है। ईजी टीटी प्रतिपादन या प्रतिध्वनि नहीं कर रहा है। - dlamblin
यह निफ्टी है। ध्यान दें कि यदि आप इसे मैन्युअल रूप से फिर से शुरू किए बिना पृष्ठभूमि में कंटेनर शुरू करना चाहते हैं (कहें कि क्या आप एक वेब सेवा चला रहे हैं), '-itd' पैरामीटर का उपयोग करें, और CTRL-p CTRL-q को रोकने के बिना अलग करने के लिए कंटेनर। - taranaki


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

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

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


4
2018-02-07 17:21



+1 "ऐसा लगता है कि डॉकर ने आदेश दिया" :-) - Matt Alexander


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

  1. Dockerfile

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

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

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

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


0
2018-05-03 19:55