मैं पहले से मौजूद डॉकटर कंटेनर पर एक कमांड कैसे चला सकता हूं?


492

मैंने एक कंटेनर बनाया है, -dइसलिए यह इंटरैक्टिव नहीं है।

docker run -d shykes/pybuilder bin/bash

मैं देख रहा हूँ कि कंटेनर बाहर निकल गया है:

CONTAINER ID        IMAGE                     COMMAND             CREATED             STATUS                      PORTS               NAMES
d6c45e8cc5f0        shykes/pybuilder:latest   "bin/bash"          41 minutes ago      Exited (0) 2 seconds ago                        clever_bardeen

अब मैं मशीन पर सामयिक कमांड चलाना और बाहर निकलना चाहूंगा। सिर्फ प्रतिक्रिया पाने के लिए।

मैंने मशीन शुरू करने की कोशिश की। मैंने अटैच करने की कोशिश की। मैंने सोचा कि मैं runएक कंटेनर के साथ कॉल कर सकता हूं , लेकिन इसकी अनुमति नहीं लगती है। का उपयोग कर startबस चलाने के लिए लगता है और फिर जल्दी से मौजूद हैं।

मैं बाहर निकलने के बाद इंटरैक्टिव मोड में वापस जाना चाहता हूं।

मैंने कोशिश की:

docker attach d6c45e8cc5f0

लेकिन मुझे मिलता है:

2014/10/01 22:33:34 You cannot attach to a stopped container, start it first

लेकिन अगर मैं इसे शुरू करता हूं, तो यह वैसे भी बाहर निकल जाता है। पकड़ो 22. मैं जीत नहीं सकता।


आप कैसे जानते हैं कि डॉकटर कंटेनर बाहर निकल गया था? आपने क्या आदेश चलाया?
थूफ़ीर


यदि आपको केवल फ़ाइल सिस्टम की आवश्यकता है: एक अलग कमांड के साथ एक रोका डॉकर कंटेनर कैसे शुरू करें? (ध्यान दें कि पर्यावरण चर और स्मृति में अन्य चीजें पहले से ही खो जाती हैं जब कंटेनर बंद हो जाता है।)
फ्रैंकलिन यू

जवाबों:


548

अक्टूबर 2014 में डॉकर टीम ने docker execकमांड पेश की : https://docs.docker.com/engine/reference/commandline/exec/

तो अब आप किसी भी कंटेनर को अपनी आईडी (या नाम) जानकर ही चला सकते हैं:

docker exec -it <container_id_or_name> echo "Hello from container!"

ध्यान दें कि execकमांड केवल पहले से चल रहे कंटेनर पर काम करता है। यदि कंटेनर वर्तमान में बंद हो गया है, तो आपको पहले इसे निम्न कमांड के साथ चलाने की आवश्यकता है:

docker run -it -d shykes/pybuilder /bin/bash

यहां सबसे महत्वपूर्ण चीज -dविकल्प है, जिसका मतलब है detached। इसका मतलब है कि आपके द्वारा शुरू में कंटेनर को प्रदान की गई कमांड ( /bin/bash) पृष्ठभूमि में चलाई जाएगी और कंटेनर तुरंत बंद नहीं होगा ।


120
यह एक रुके हुए कंटेनर पर काम नहीं करता है, केवल एक चल रहा है। इसलिए यदि आपके पास एक कंटेनर है जो तुरंत ही अपने आप को रोक देता है, जैसे कि प्रश्न में, यह वास्तव में इसके अंदर चल रहे कुछ और प्राप्त करने के लिए काम नहीं करेगा।
इंटर

4
@ आंतरिक सही है, और सीडीआर एलडीएन का अधिक व्यापक उत्तर है।
डॉ। जन-फिलिप गेर्के

6
@ जनवरी-PhilipGehrcke Btw इस व्यक्ति के उपयोगकर्ता नाम से बदल गया है CDR LDNकरने के लिए cdrevनीचे दिए गए जवाब (के लिए stackoverflow.com/a/26181666/149428 )।
टेलर एड्मिस्टन

3
क्यों गुजर रहा है -it?
इयूलियन ओनोफ्रेई

4
omg यह इतना जटिल क्यों है? ऐसा लगता है कि सबसे बुनियादी चीज़ आपको करने की ज़रूरत है। हमें इसका उस तरह से उपयोग नहीं करना चाहिए जिस तरह से वे करना चाहते हैं।
सूडो

287

आपका कंटेनर आपके द्वारा दिए गए आदेश के अनुसार बाहर निकल जाएगा। इसे जीवित रखने के लिए निम्नलिखित विकल्पों का उपयोग करें:

  • -i संलग्न न होने पर भी STDIN को खुला रखें।
  • -t एक छद्म-TTY आवंटित करें।

तो आपका नया runआदेश है:

docker run -it -d shykes/pybuilder bin/bash

यदि आप पहले से चल रहे कंटेनर में संलग्न करना चाहते हैं:

docker exec -it CONTAINER_ID /bin/bash

इन उदाहरणों /bin/bashमें कमांड के रूप में उपयोग किया जाता है।


2
की कोशिश की docker exec -it CONTAINER_ID /bin/bash -c "export VAR=1 && echo $VAR"और खाली चर मुद्रित (उम्मीद 1)। मैं क्या खो रहा हूँ?
पीला

'docker exec -it CONTAINER_ID / bin / bash' चलाने के बाद यह सही ढंग से bash पर जाता है, लेकिन इसके साथ इंटरैक्ट नहीं कर सकता।
ब्लू क्लाउड्स

1
लेकिन अगर मैं docker-compose का उपयोग कर रहा हूँ तो -itउपलब्ध नहीं है।
adnanmuttaleb

120

इसलिए मुझे लगता है कि ऊपर दिए गए कई भ्रामक उत्तरों की तुलना में उत्तर सरल है।

एक मौजूदा कंटेनर शुरू करने के लिए जिसे रोका गया है

docker start <container-name/ID>

एक चल रहे कंटेनर को रोकने के लिए

docker stop <container-name/ID>

फिर एक कंटेनर के इंटरेक्टिव शेल में लॉगिन करने के लिए

docker exec -it <container-name/ID> bash

एक मौजूदा कंटेनर शुरू करने और इसे एक कमांड में संलग्न करने के लिए

docker start -ai <container-name/ID>

खबरदार, यह कंटेनर को बाहर निकलने पर रोक देगा। लेकिन सामान्य तौर पर, आपको कंटेनर को शुरू करने की आवश्यकता होती है, आपके द्वारा किए जाने के बाद इसे संलग्न करना और रोकना।


docker संलग्न <कंटेनर-नाम / ID> जो चल रहा है
कुनमिंग Xie

9
@ पेटर टी। वास्तव में, मैंने आपके उत्तर को अन्य लोगों की तुलना में अधिक संक्षिप्त पाया। मुझे समझ में नहीं आता कि लोग एक बहुत ही सरल प्रश्न को जटिल क्यों करना पसंद करते हैं। धन्यवाद पीटर इस जवाब।
हेलेन नेली

1
इसके लिए आवश्यक है कि जब आपने docker बनाया था, आपने इसे -it stackoverflow.com/questions/45216612/… के साथ किया था, अन्यथा यह प्रारंभ नहीं होगा .. तो आप docker प्रारंभ करेंगे <कंटेनर-आईडी> और फिर docker ps -l और आप देखेंगे कि यह शुरू होने के बाद नहीं है। और फिर अनुलग्नक विफल हो जाएगा। तो यह भी साथ बनाना होगा।
बार्लॉप

1
@Peter सबसे अधिक प्रासंगिक उत्तर
नीलांजन सरकार

1
यह सबसे सटीक उत्तर है!
नागेन्द्र ५४47

91

कटराम्र के जवाब पर विस्तार करने के लिए, यदि कंटेनर को रोक दिया गया है और त्रुटि के कारण शुरू नहीं किया जा सकता है, तो आपको commitइसे एक छवि की आवश्यकता होगी । फिर आप नई छवि में बैश लॉन्च कर सकते हैं:

docker commit [CONTAINER_ID] temporary_image
docker run --entrypoint=bash -it temporary_image

1
FYI करें, मैं यह इतना करता हूं कि मैंने एक साथ एक कमांड डाल dshellदी है, जो इसे विभिन्न स्थितियों में स्वचालित रूप से करने के लिए कहा जाता है - github.com/avirshup/docker-cli-sugar
हारून वी

41

यहां कुछ उत्तर भ्रामक हैं क्योंकि वे उन कंटेनरों की चिंता करते हैं जो चल रहे हैं, रुके नहीं।

डॉक फोरम पर Sven Dowideit ने बताया कि कंटेनर अपनी प्रक्रिया के लिए बाध्य होते हैं (और Docker किसी रुके हुए कंटेनर की प्रक्रिया को बदल नहीं सकता है, कम से कम इसकी आंतरिक संरचना के कारण प्रतीत होता है: https://github.com/docker/docker-issues / 1437 )। तो, मूल रूप commitसे एक छवि के लिए कंटेनर का एकमात्र विकल्प है और runयह एक अलग कमांड के साथ है।

Https://forums.docker.com/t/run-command-in-stnect-container/343 देखें
(मेरा मानना ​​है कि " ENTRYPOINTतर्कों के साथ" दृष्टिकोण या तो काम नहीं करेगा, क्योंकि आप अभी भी बदलने में सक्षम नहीं होंगे। एक बंद कंटेनर के लिए तर्क।)


2
सूचना: कंटेनर के bin/bashबिना चलने से -itकुछ भी नहीं बदलेगा, इसलिए यह वास्तव में आवश्यक नहीं है और सीडीआर एलडीएन ओपी की विशेष स्थिति के लिए सही उत्तर देता है। फिर भी, commitकंटेनर प्रक्रिया को कैसे बदलना है, इसकी तकनीकी समस्या का जवाब है।
कट्र्म

रन-कमांड-इन-द-कंटेनर में कैंडलरब द्वारा टिप्पणी, निष्क्रिय कंटेनर से आयतन के साथ एक थकाऊ छवि का उपयोग करने का सुझाव देते हुए: मेरे लिए काम करते हैं: docker run --rm --volumes से CONTAINER -i बिजीबॉक्स टार cbO / var / डीआईआर | gzip -c> ~ / mydir_backup.tgz
eel ghEEz

यह पूछे गए प्रश्न का वास्तविक उत्तर है। कंटेनर अपनी प्रक्रिया के लिए बाध्य हैं, इसलिए कमांड को बदला नहीं जा सकता है।
cjsimon

21

मुझे अपनी कमांड चलाने के लिए bash -c का उपयोग करना पड़ा: docker exec -it CONTAINER_ID bash -c "mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql mysql"


1
-c ने मेरे लिए काम किया। आश्चर्य है कि अकेले बैश काम क्यों नहीं करेगा (शीघ्र नहीं मिलता है)
एंड्रे वेरलैंग

18

एक कंटेनर बनाना और एक से एक करके कमांड भेजना:

docker create --name=my_new_container -it ubuntu
docker start my_new_container
// ps -a says 'Up X seconds'
docker exec my_new_container /path/to/my/command
// ps -a still says 'Up X+Y seconds'
docker exec my_new_container /path/to/another/command

यह सवाल का अच्छा जवाब है। यदि आप निर्माण के बाद कंटेनर को शुरू करना चाहते हैं और इसमें "docker exec" कमांड को सक्षम कर सकते हैं, तो आपको इसे do-create में "-it" झंडे के साथ बनाना होगा।
जोनलोफे

8

यह एक संयुक्त उत्तर है जो मैंने ऊपर सीडीआर एलडीएन उत्तर का उपयोग करके बनाया था और उत्तर मुझे यहां मिला ।

निम्न उदाहरण एक छवि से आर्क लिनक्स कंटेनर शुरू करता है, और फिर उपकरण gitका उपयोग करके उस कंटेनर पर स्थापित होता है pacman:

sudo docker run -it -d archlinux /bin/bash
sudo docker ps -l
sudo docker exec -it [container_ID] script /dev/null -c "pacman -S git --noconfirm"

बस इतना ही।


5

यदि आप शेल स्क्रिप्ट चलाने की कोशिश कर रहे हैं, तो आपको इसे बैश के रूप में चलाने की आवश्यकता है।

docker exec -it containerid bash -c /path/to/your/script.sh

4

स्टड करने के लिए एक कमांड पाइप

-tइसे काम करने के लिए निकालना होगा :

echo 'touch myfile' | sudo docker exec -i CONTAINER_NAME bash

यह अधिक सुविधाजनक हो सकता है कि कभी-कभी सीएलआई विकल्पों का उपयोग करना।

के साथ परीक्षण किया गया:

sudo docker run --name ub16 -it ubuntu:16.04 bash

फिर दूसरे शेल पर:

echo 'touch myfile' | sudo docker exec -i ub16 bash

फिर पहले खोल पर:

ls -l myfile

डॉकर 1.13.1, उबंटू 16.04 होस्ट पर परीक्षण किया गया।


3

मान लें कि छवि डिफ़ॉल्ट एंट्रीपॉइंट का उपयोग कर रही है /bin/sh -c, रनिंग /bin/bashडेमन मोड ( -d) में तुरंत बाहर निकल जाएगी । यदि आप चाहते हैं कि यह कंटेनर एक इंटरेक्टिव शेल चलाए, तो -itइसके बजाय उपयोग करें -d। यदि आप आमतौर पर किसी अन्य प्रक्रिया को निष्पादित करने वाले कंटेनर में मनमाना आदेशों को निष्पादित करना चाहते हैं, तो आप कोशिश करना चाहते हैं nsenterया कर सकते हैं nsinit। विवरण के लिए https://blog.codecentric.de/en/2014/07/enter-docker-container/ पर एक नज़र डालें ।


3

दुर्भाग्य से इस लक्ष्य को हासिल करने के लिए ENTRYPOINTतर्कों के साथ ओवरराइड करना असंभव है docker run --entrypoint

नोट: आप --entrypoint का उपयोग करके ENTRYPOINT सेटिंग को ओवरराइड कर सकते हैं, लेकिन यह केवल बाइनरी को निष्पादित करने के लिए सेट कर सकता है (कोई श-सी का उपयोग नहीं किया जाएगा)।


3

मैं यह नोट करना चाहूंगा कि शीर्ष उत्तर थोड़ा भ्रामक है।

निष्पादन के साथ मुद्दा यह docker runहै कि हर बार एक नया कंटेनर बनाया जाता है। हालांकि, ऐसे मामले हैं जहां हम पुराने कंटेनरों को फिर से देखना चाहेंगे या नए कंटेनरों के साथ जगह नहीं लेंगे।

(दिया clever_bardeenगया कंटेनर का नाम ...)

ओपी के मामले में, सुनिश्चित करें कि डॉक की छवि पहले निम्नलिखित कमांड को निष्पादित करके चल रही है:

docker start clever_bardeen

फिर, निम्न आदेश का उपयोग कर docker कंटेनर निष्पादित करें:

docker exec -it clever_bardeen /bin/bash

2

मैक के लिए:

$ docker exec -it <container-name> sh

यदि आप मूल उपयोगकर्ता के रूप में कनेक्ट करना चाहते हैं:

$ docker exec -u 0 -it <container-name> sh

1

सरल उत्तर: उसी समय शुरू करें और संलग्न करें। इस मामले में आप वही कर रहे हैं जो आपने मांगा था।

docker start <CONTAINER_ID/CONTAINER_NAME> && docker attach <CONTAINER_ID/CONTAINER_NAME> 

परिवर्तन सुनिश्चित करें <CONTAINER_ID/CONTAINER_NAME>



1

मैं विंडोज़ कंटेनर चला रहा हूँ और मुझे फाइल और फोल्डर बनाने और कॉपी करने के लिए डॉकटर कंटेनर के अंदर देखना होगा।

आदेश में कि मैं कंटेनर के अंदर चल रहा कमांड प्रॉम्प्ट प्राप्त करने या कंटेनर को संलग्न करने के लिए डॉक एंट्रीपॉइंट कमांड का उपयोग कर रहा हूं।

ENTRYPOINT ["C:\\Windows\\System32\\cmd.exe", "-D", "FOREGROUND"]

इससे मुझे कमांड प्रॉम्प्ट से कंटेनर को जोड़ने और कंटेनर को लाइव रखने में मदद मिली। :)


0

हाल ही में बाहर निकलने वाले कंटेनर को फिर से शुरू करने और एक्सेस करने का एक त्वरित तरीका:

docker start -a -i `docker ps -q -l`

0

मैं आमतौर पर इसका उपयोग करता हूं:

    docker exec -it my-container-name bash

एक निरंतर कंटेनर के साथ बातचीत करने के लिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.