एक नए टीटीवाई के साथ पहले से चल रहे डॉकटर कंटेनर में कैसे प्रवेश करें


545

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

क्या एक चल रहे कंटेनर में एक और ट्टी संलग्न करना संभव है? संभवतः, मैं इस तथ्य का लाभ उठा सकता हूं कि डॉकर वास्तव में एलएक्ससी कंटेनरों के चारों ओर लपेट रहा है? मैंने कोशिश की है sudo lxc-console -n [container-id] -t [1-4]लेकिन ऐसा प्रतीत होता है कि केवल एक ट्टी उपलब्ध कराई गई है और वह है अपाचे डेमॉन चलाने वाली। शायद निर्माण के दौरान कई lxc कंसोल को सक्षम करने का एक तरीका है?

यदि संभव हो तो मैं एक खुलने वाली सेवा के साथ कंटेनर को कॉन्फ़िगर और निर्माण नहीं करूंगा ।


7
क्या आपने कोशिश की docker attach [conainer-id]?
shabbychef

13
@shabbhehef जब तक डॉक अटैचमेंट नहीं बदला गया है, अटैच कमांड रनिंग ट्टी को अटैच करता है, एक नया नहीं, इसलिए प्रश्न शीर्षक "... नई TTY के साथ" है। यही कारण है कि नीचे दिए गए उत्तर में संलग्न कमांड का उपयोग नहीं किया गया है।
प्रोग्रामर

1
1.3 के बाद से इस उत्तर
थॉमसलेविल

जवाबों:


1060

डॉकटर 1.3 के साथ, एक नई कमांड है docker exec। यह आपको एक रनिंग डॉकटर दर्ज करने की अनुमति देता है:

docker exec -it [container-id] bash

30
मैंने इसे सही उत्तर होने के लिए (अपने खुद से) बदल दिया है क्योंकि यह नई विधि, जो कि प्रश्न के समय के आसपास नहीं थी, सबसे अच्छी वर्तमान विधि IMO है।
प्रोग्रामर

3
हालाँकि, execसामान्य टर्मिनल की तरह काम नहीं करता है। उदाहरण के लिए आप कंटेनर के अंदर एक बार उपयोगकर्ता नहीं बदल सकते।
पिथिकोस

3
@Pithikos: मैं एक शेल चलाने के लिए निष्पादन का उपयोग करने और फिर su someuserउपयोगकर्ता को बदलने में सक्षम हूं । रनिंग डॉकर 1.4.1
13

2
इस चर्चा को पढ़ने वाले किसी को भी नोट करें। मुझे यकीन है कि docker exec -itअंततः एक पूरी तरह से कार्यात्मक छद्म tty प्रदान करेगा, लेकिन अब (डॉकर संस्करण 1.9.1) के लिए, कुछ कमियां हैं: github.com/docker/docker/issues/8755
blong

18
अगर आपको त्रुटि निष्पादित होती है: "bash": निष्पादन योग्य फ़ाइल $ PATH में नहीं मिली है तो आप यह कोशिश कर सकते हैं: docker exec -it [कंटेन-id] / bin / sh
Dai Kaixian

42

आपको SSH का उपयोग किए बिना एक कंटेनर में प्रवेश करने के लिए me nsenter ’नामक Jérôme Petazzoni के उपकरण का उपयोग करना चाहिए। देखें: https://github.com/jpetazzo/nsenter

बस चलाने के साथ स्थापित करें: docker run -v /usr/local/bin:/target jpetazzo/nsenter

फिर docker-enter <container-id>कंटेनर में प्रवेश करने के लिए कमांड का उपयोग करें ।


यह सही तरीका है। ब्लॉग देखें ।
जेसी ग्लिक जूल

5
डॉकटर 1.3 के साथ, एक नई कमांड है docker exec। यह आपको एक रनिंग डॉकटर में प्रवेश करने की अनुमति देता है: docker exec -it <container-id> bash(मेरा उत्तर नीचे देखें)
माइकल_शर्फ

5
है docker-enterअभी भी मौजूद हैं? यह मुझे देता है command not found
स्नोक्रैश

22

अपडेट करें

Docker 0.9 के रूप में, अब काम करने के लिए नीचे दिए गए चरणों के लिए, एक को अब डेमॉन को पुनरारंभ करने से पहले docker डेमन स्टार्टअप विकल्प के /etc/default/dockerसाथ फाइल को अपडेट करना होगा '-e lxc'(मैंने होस्ट को रीबूट करके ऐसा किया)।

/ etc / डिफ़ॉल्ट / docker फ़ाइल का अद्यतन

यह सब इसलिए है क्योंकि ...

... यह [do 0.9 0.9] कंटेनर शुरू करने के लिए LXC की तुलना में अन्य एपीआई का उपयोग संभव बनाने के लिए एक नया "इंजन ड्राइवर" अमूर्त होता है। यह एक नया API लाइब्रेरी (लिबकनटेनर) पर आधारित एक नया इंजन ड्राइवर भी प्रदान करता है जो LXC टूल का उपयोग किए बिना कंट्रोल ग्रुप को संभालने में सक्षम है। मुख्य मुद्दा यह है कि यदि आप अपने कंटेनर पर कार्रवाई करने के लिए lxc-संलग्न पर भरोसा कर रहे हैं, जैसे कि कंटेनर के अंदर एक शेल शुरू करना, जो कि विकास के वातावरण के लिए पागलपनपूर्ण है ...

स्रोत

कृपया ध्यान दें कि यह नए होस्ट को केवल "काम करने" से डॉकटर 0.11 के वैकल्पिक नेटवर्क को रोक देगा और आपको केवल लूपबैक इंटरफ़ेस दिखाई देगा। बग रिपोर्ट


यह पता चला है कि एक अलग प्रश्न का हल भी इस एक का समाधान था:

... आप ps -notruncपूर्ण lxc कंटेनर आईडी प्राप्त करने के लिए docker का उपयोग कर सकते हैं और फिर lxc-attach -n <container_id>उस कंटेनर में रूट के रूप में रन बैश का उपयोग कर सकते हैं ।

अद्यतन: आपको जल्द ही उपयोग ps --no-truncकरने की आवश्यकता होगी ps -notruncजिसके बजाय पदावनत किया जा रहा है।

यहाँ छवि विवरण दर्ज करें पूर्ण कंटेनर आईडी खोजें

यहाँ छवि विवरण दर्ज करें Lxc संलग्न कमांड दर्ज करें।

यहाँ छवि विवरण दर्ज करें शीर्ष मेरी अपाचे प्रक्रिया को दर्शाता है जो डॉक शुरू हुआ।


तो, सिर्फ डॉकर के साथ ऐसा करने का कोई तरीका नहीं है, है ना? मैं व्यक्तिगत रूप से खुद LXC में मिश्रण नहीं करना चाहता हूं।
13

क्या bash लॉन्च करने के बजाय lxc-संलग्न के साथ कमांड चलाने का कोई तरीका है? धन्यवाद!!
जोसेलो

@qkrijger जहां तक ​​मुझे पता है कि सही है। क्यों "मिश्रण" LXC के बारे में चिंतित हैं? आप महसूस करते हैं कि डॉक LXC के ठीक ऊपर बना है?
प्रोग्रामर

@ जोसेलो मैं आपके सवाल को नहीं समझता, लेकिन मेरा सुझाव है कि आप अधिक विस्तार के साथ एक नई पोस्ट बनाएं? डॉक प्रक्रिया शुरू करने के कई तरीके हैं, जैसे बैश के साथ या डेम विथ -d आदि
प्रोग्रामर

@programster हाँ, मुझे एहसास हुआ कि :) फिर भी, LXC का उपयोग करके सीधे Docker के साथ संयोजन में हैकिंग की तरह लगता है। मज़ा, लेकिन वास्तव में बनाए रखने योग्य नहीं। सामान्य तौर पर, किसी को एब्सट्रैक्शन लेयर में कोड करना चाहिए जिसे किसी ने काम करने के लिए चुना है। यदि आपको वास्तव में खुद LXC की आवश्यकता है, तो Docker पर पुल अनुरोध के लिए समय हो सकता है :)
qkrijger

7

पहला चरण कंटेनर आईडी प्राप्त करें:

docker ps

यह आपको कुछ इस तरह दिखाएगा

कंटेनर आईडी इमेजेज बनाई गई स्टेटस पोर्टल नाम

1170fe9e9460 लोकलहोस्ट: 5000 / पायथन: env-7e847468c4d73a0f35e9c5164046ad88 "./run_notebook.sh" 26 सेकंड्स: 25 सेकंड्स: ऊपर 25 सेकंड 0.0.0.0:8989->9999/tcp SLURM_TASK-3037

1170fe9e9460 इस मामले में कंटेनर आईडी है।

दूसरा , डॉकटर दर्ज करें:

docker exec -it [container_id] bash

उपर्युक्त मामले में: docker exec -it 1170fe9e9460 bash


5

कंटेनर के भीतर tmux / GNU स्क्रीन को चलाने के बारे में क्या? लगता है एक सरल के रूप में कई vty के रूप में उपयोग करने के लिए आसान तरीका है:

$ docker attach {container id}

यह एक ठीक समाधान है यदि आप जानते हैं कि आप एक कंटेनर तक पहुंच प्राप्त करना चाहेंगे (उदाहरण के लिए इसे डीबग करना), लेकिन यह ओपी की मदद नहीं करेगा जो बताता है कि वे मौजूदा कंटेनर के आसपास देखना चाहते हैं।
लुका स्पिलर

1
इस उत्तर के साथ मेरा मुद्दा यह है कि लोगों ने पहले से ही उपयोग करने के बारे में पूछा है docker attachऔर मैंने बताया कि:...the attach command attaches to the running tty, not a new one, hence the question title is "...with new TTY"
प्रोग्रामर

ठीक है, अगर कंटेनर पहले से ही चल रहा है तो यह समाधान आपकी मदद नहीं करेगा, लेकिन अगर आप पहले से ही मल्टीप्लेक्स चलाने का ख्याल रखते हैं, तो आपको अतिरिक्त ट्टी की कोई आवश्यकता नहीं होगी ... वास्तव में जब से मैंने tmux का उपयोग करना शुरू किया है, मैं एक tty का उपयोग करता हूं और केवल एक ही सबकुछ करने की जरूरत है जो मुझे एक बार tmux में चाहिए जितनी मैं चाहता हूं उतने vtys को स्पॉन कर सकता हूं।
सिगरेट ०

4

nsenterक्या वो। हालाँकि, मुझे एक कंटेनर को एक सरल तरीके से दर्ज करने की आवश्यकता थी और nsenter ने मेरी आवश्यकताओं के लिए पर्याप्त नहीं किया। यह कुछ अवसरों में छोटी गाड़ी थी (ब्लैक स्क्रीन प्लस -वेड फ्लैग काम नहीं कर रहा था)। इसके अलावा मैं एक विशिष्ट उपयोगकर्ता के रूप में और एक विशिष्ट निर्देशिका में लॉगिन करना चाहता था।

मैंने कंटेनरों में प्रवेश करने के लिए अपना खुद का उपकरण बनाया। आप इसे यहां देख सकते हैं: https://github.com/Pithikos/docker-enter

इसका उपयोग जितना आसान है

./docker-enter [-u <user>] [-d <directory>] <container ID>

बस कोशिश की, बहुत अच्छा! उबंटु को सुपो एप्ट-गेट बिल्ड-एसेंशियल -y gcc docker-enter.c -o docker-enter sudo ./docker-enter <शॉर्ट-कंटेनर-आईडी> नाइस चलाने के लिए अच्छा लगा कि मुझे पूरा वीडियो नहीं मिला है। lxc-अनुलग्नक-कोडबेस इतना छोटा है कि कोई भी दुर्भावनापूर्ण चीज़ देखने के लिए पूरी तरह से स्कैन कर सकता है।
प्रोग्रामर

मैंने githoo पर github.com/steveeJ/personal-portage-overlay पर ऐप-एमुलेशन / डॉक-एंटर के रूप में एक पुनर्निर्माण उपलब्ध कराया ।
स्टेफंजुकर

मैं एक ट्यूटोरियल / लिपि में ubuntu उपयोगकर्ताओं के लिए इस स्वत: के लिए शामिल किया है programster.blogspot.co.uk/2014/01/...
Programster

2

"Nsinit" तरीका है:

nsinit स्थापित करें

git clone git@github.com:dotcloud/docker.git
cd docker
make shell

कंटेनर के अंदर से:

go install github.com/dotcloud/docker/pkg/libcontainer/nsinit/nsinit

बाहर से:

docker cp id_docker_container:/go/bin/nsinit /root/

इसका इस्तेमाल करें

cd /var/lib/docker/execdriver/native/<container_id>/
nsinit exec bash

2
docker exec -t -i container_name /bin/bash

आपको कंटेनर कंसोल में ले जाएगा।


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


1

मैं एक चल रहे Microsoft / iis चलाने के लिए डेमॉन का उपयोग कर के रूप में शक्तियां शुरू कर दिया

docker exec -it <nameOfContainer> powershell

लगता है जैसे प्रश्न एक लिनक्स आधारित कंटेनर के बारे में था। यह उत्तर शायद तभी काम करेगा जब आपके पास विंडोज़-आधारित कंटेनर हो-या- यदि आपके पास स्थापित PowerShell का .NET कोर संस्करण है, जैसे PowerShell 6 या बाद का संस्करण।
मैनफ्रेड

0

पर Windows 10 , मैं डोकर स्थापित की है। मैं एक कंटेनर पर Jnekins चला रहा हूं और मुझे उसी त्रुटि संदेश का सामना करना पड़ा। इस समस्या को हल करने के लिए यहां एक कदम दर कदम गाइड है:

चरण 1: gitbash खोलें और docker run -p 8080: 8080 -p 50000: 50000 jenkins चलाएं।

चरण 2: एक नया टर्मिनल खोलें।

चरण 3: चल रहे कंटेनर की सूची प्राप्त करने के लिए "docker ps" करें। कंटेनर आईडी कॉपी करें।

चरण 4: अब यदि आप "docker exec -it {कंटेनर id} sh" या "docker exec -it {कंटेनर id} bash" करते हैं, तो आपको "इनपुट डिवाइस एक TTY नहीं है" के समान त्रुटि संदेश मिलेगा। मिनिट का उपयोग करते हुए, कमांड को 'विनिपेट' के साथ उपसर्ग करने की कोशिश करें "

चरण 5: रन कमांड " $ विनकेट डॉकटर निष्पादन-यह {कंटेनर आईडी} श "

वोला !! अब आप टर्मिनल के अंदर हैं।

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