क्या चल रहे कंटेनर (बिना ssh) में शेल सत्र शुरू करना संभव है


341

मैं इस आदेश की अपेक्षा कर रहा था कि एक चालू कंटेनर में एक बैश शेल चलाने के लिए:

docker run "id of running container" /bin/bash

ऐसा लगता है कि यह संभव नहीं है, मुझे त्रुटि मिलती है:

2013/07/27 20:00:24 Internal server error: 404 trying to fetch remote history for 27d757283842

इसलिए, यदि मैं एक चालू कंटेनर में बैश शेल चलाना चाहता हूं (उदाहरण के लिए निदान प्रयोजनों के लिए)

क्या मुझे इसमें SSH सर्वर चलाना है और ssh के माध्यम से loggin है?


1
docker run CONTAINER1.0 में योजनाबद्ध है
kolypto

7
चूंकि डॉकटर 1.3 आपको वास्तव में इस उत्तर
थॉमसलेविल

1
बसdocker attach container_name
मैक्सबेलेक

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

जवाबों:


285

संपादित करें: अब आप docker exec -it "id of running container" bash( डॉक्टर ) का उपयोग कर सकते हैं

पहले, इस प्रश्न का उत्तर था:

यदि आपको वास्तव में होना चाहिए और आप डिबग वातावरण में हैं, तो आप यह कर सकते हैं: sudo lxc-attach -n <ID> ध्यान दें कि आईडी को पूर्ण होना चाहिए ( docker ps -notrunc)।

हालांकि, मैं इसके खिलाफ दृढ़ता से अनुशंसा करता हूं।

सूचना: -notruncपदावनत किया गया है, इसे --no-truncजल्द ही बदल दिया जाएगा।


1
आप इसके खिलाफ अनुशंसा क्यों करते हैं?
मैक्स एल।

7
मैं इसके खिलाफ सलाह देता हूं क्योंकि 1) इसके लिए बहुत हाल के कर्नेल की आवश्यकता होती है, 2) आप डॉकटर के बाहर काम कर रहे हैं ताकि आप इसे ट्रैक नहीं कर पाएंगे (लॉग्स, अटैचमेंट आदि)। इसके अलावा, docker अभी lxc का उपयोग कर सकता है, लेकिन इसकी कोई वारंटी नहीं है कि यह हमेशा के लिए ऐसा करेगा।
21

1
0.7.6 को अद्यतन करने का प्रयास करें। Docker अभी भी lxc का उपयोग कर रहा है और lxc-attachबस ठीक काम करना चाहिए। मैंने सिर्फ दोगुना चेक किया और यह मेरे लिए काम करता है। (ध्यान दें कि यह कर्नेल से पहले 3.8 के साथ काम नहीं करेगा)।
क्रीक

2
0.9 डॉकटर के रूप में अब डिफ़ॉल्ट रूप से LXC के साथ नहीं चलता है। आप के साथ डोकर deamon को लांच करने के लिए होता हैdocker -d -e lxc
kevzettler

2
मैक्स एल।, आपके उपयोग के मामले को डेटा वॉल्यूम के साथ हल किया जा सकता है । उदाहरण का परीक्षण नहीं किया गया: 1) डेटा वॉल्यूम में नग्नेक्स लॉग के साथ कंटेनर चलाएं docker run -v /var/log/nginx -name somename imagename command:; 2) डेटा की मात्रा सामग्री को देखने के लिए एक और कंटेनर चलाएँ: docker run -volumes-from somename -i -t busybox /bin/sh

615

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

docker exec -it "id of running container" bash

2
यह मेरे लिए बहुत अच्छा काम किया। डॉक चलाने के लिए बहुत उपयोगी इसके अलावा।
oraserrata

क्या होगा यदि मैंने एक चल रहे कंटेनर को निष्पादित करते समय परिवर्तन किए और ऑनलाइन परिवर्तनों को प्रतिबिंबित करना चाहता था? सबसे अच्छा अभ्यास क्या है?
मीडियाोट

बहुत उपयोगी। धन्यवाद आप
luongnv89

docker psरनिंग इंस्टेंस की आईडी प्राप्त करने के लिए उपयोग करें
muon

नोट: कंटेनर में बैश नहीं हो सकता (»निष्पादन:" बैश ": निष्पादन योग्य फ़ाइल नहीं मिली«)। docker inspect <image>यह देखने के लिए उपयोग करें कि शेल क्या उपलब्ध है। docker exec -it <container id> /bin/shइसके बजाय दौड़ते हैं।
Pixbrackets

14

बस करो

docker attach container_name

जैसा कि टिप्पणियों में उल्लेख किया गया है, कंटेनर से इसे रोकने के बिना अलग करने के लिए, Ctrlpफिर टाइप करें Ctrlq


5
धन्यवाद!! यह मदद करता है। और वास्तविक प्रश्न के संदर्भ में, मैं कुछ जोड़ना चाहूंगा। हमारे कंटेनर का उपयोग करने के बाद डिबगिंग के बाद, का docker attach container_nameउपयोग करें ctrl pऔर के ctrl qबजाय exitexitकमांड कंटेनर को रोकता है, जहां पर ctrlpऔर ctrl qबस उस कंटेनर को अलग करता है और इसे चालू रखता है
फीनिक्स

10

चूंकि चीजें बदल रही हैं, फिलहाल एक चल रहे कंटेनर तक पहुंचने का अनुशंसित तरीका उपयोग कर रहा है nsenter

आप इस github भंडार पर अधिक जानकारी पा सकते हैं । लेकिन सामान्य तौर पर आप इस तरह nsenter का उपयोग कर सकते हैं:

PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)
nsenter --target $PID --mount --uts --ipc --net --pid

या आप आवरण का उपयोग कर सकते हैं docker-enter:

docker-enter <container_name_or_ID>

विषय पर एक अच्छी व्याख्या Jérôme Petazzoni के ब्लॉग प्रविष्टि पर पाई जा सकती है: आपको अपने डॉक कंटेनर में sshd चलाने की आवश्यकता क्यों नहीं है


दुर्भाग्य से, एनवी चर इस दृष्टिकोण का उपयोग कर गड़बड़ कर रहे हैं (यदि आप लिंक द्वारा बनाए गए चर की जांच करना चाहते हैं)। मैं करने का सुझाव देता हूं source /proc/*/environ
टॉमस टोमसेक

8

पहली बात तो तुम दौड़ नहीं सकते

docker run "existing container" command

क्योंकि यह कमांड एक छवि की उम्मीद कर रहा है न कि एक कंटेनर की और यह वैसे भी एक नए कंटेनर को जन्म देगा (इसलिए वह नहीं जिसे आप देखना चाहते थे)

मैं इस तथ्य से सहमत हूं कि डॉकटर के साथ हमें अपने आप को एक अलग तरीके से सोचने के लिए धक्का देना चाहिए (इसलिए आपको ऐसे तरीके खोजने चाहिए ताकि आपको कंटेनर पर लॉग इन करने की आवश्यकता न हो), लेकिन मुझे अभी भी यह उपयोगी लगता है और यह है कि मैं कैसे काम करता हूं इसके आसपास।

मैं DEAMON मोड में पर्यवेक्षक के माध्यम से अपनी कमांड चलाता हूं।

तब मैं निष्पादित करता हूं जो मैं कहता हूं docker_loop.sh सामग्री बहुत अधिक है:

#!/bin/bash
/usr/bin/supervisord
/usr/bin/supervisorctl
while ( true )
    do
    echo "Detach with Ctrl-p Ctrl-q. Dropping to shell"
    sleep 1
    /bin/bash
done

यह क्या करता है कि यह आपको कंटेनर को "संलग्न" करने की अनुमति देता है supervisorctlऔर लॉग को रोकने / शुरू / फिर से शुरू करने और लॉग की जांच करने के लिए इंटरफ़ेस के साथ प्रस्तुत किया जाता है । यदि वह पर्याप्त नहीं होना चाहिए, तो आप कर सकते हैं Ctrl+Dऔर आप एक शेल में गिर जाएंगे जो आपको चारों ओर झांकने की अनुमति देगा जैसे कि यह एक सामान्य प्रणाली थी।

कृपया यह भी ध्यान रखें कि यह प्रणाली शेल के बिना कंटेनर के रूप में सुरक्षित नहीं है, इसलिए अपने कंटेनर को सुरक्षित करने के लिए सभी आवश्यक कदम उठाएं।


5

इस पुल अनुरोध पर नज़र रखें: https://github.com/docker/docker/pull/7409

जो आगामी docker exec <container_id> <command>उपयोगिता को लागू करता है । जब यह उपलब्ध होता है, तो संभव है कि उदाहरण के लिए, चल रहे कंटेनर के अंदर ssh सेवा को शुरू और बंद किया जाए।

ऐसा करने के लिए भी nsinitहै: "nsinit एक चल रहे कंटेनर के नाम स्थान के अंदर एक शेल तक पहुंचने का एक आसान तरीका प्रदान करता है" , लेकिन इसे चलाना मुश्किल लगता है। https://gist.github.com/ubergarm/ed42ebbea293350c30a6


docker execडॉकटर 1.3 में उतरा, इसलिए अब चल रहे कंटेनर में एक नया शेल सत्र बनाना और शामिल करना संभव है
foz


1

कंटेनर में शेल होने का एक तरीका वास्तव में है।

मान लें कि आपका /root/run.shलॉन्च प्रक्रिया, प्रक्रिया प्रबंधक (पर्यवेक्षक), या जो भी हो।

/root/runme.shकुछ ग्नू-स्क्रीन ट्रिक्स के साथ बनाएँ :

# Spawn a screen with two tabs
screen -AdmS 'main' /root/run.sh
screen -S 'main' -X screen bash -l
screen -r 'main'

अब, आपके पास टैब 0 में आपके डेमॉन हैं, और docker attachकंटेनर 1 के अंदर क्या हो रहा है, यह देखने के लिए किसी भी समय टैब 1 में एक इंटरैक्टिव शेल ।

एक और सलाह यह है कि इस स्क्रीन ट्रिक सहित सभी आवश्यक उपकरणों के साथ उत्पादन छवि के शीर्ष पर एक "विकास बंडल" छवि बनाई जाए।


1

यहाँ मेरा समाधान है

Dockerfile का हिस्सा:

...
RUN mkdir -p /opt
ADD initd.sh /opt/
RUN chmod +x /opt/initd.sh
ENTRYPOINT ["/opt/initd.sh"]

"initd.sh" का हिस्सा

#!/bin/bash
...
/etc/init.d/gearman-job-server start
/etc/init.d/supervisor start
#very important!!!
/bin/bash

छवि बनने के बाद आपके पास निष्पादन और अटैचमेंट का उपयोग करने के दो विकल्प हैं:

  1. निष्पादन के साथ (जो मैं उपयोग करता हूं), चलाएं:

docker run --name $ CONTAINER_NAME -dt $ IMAGE_NAME

फिर

docker निष्पादित -it $ CONTAINER_NAME / bin / bash

और उपयोग करें

CTRL + D को अलग करना

  1. संलग्न करें, चलाएं:

docker run --name $ CONTAINER_NAME -it $ IMAGE_NAME

फिर

docker $ CONTAINER_NAME संलग्न करें

और उपयोग करें

अलग करने के लिए CTRL + P और CTRL + Q

विकल्पों के बीच अंतर पैरामीटर -i में है


1

इसके दो तरीके हैं।

संलग्न के साथ

$ sudo docker attach 665b4a1e17b6 #by ID

अमल के साथ

$ sudo docker exec - -t 665b4a1e17b6 #by ID

0

यदि लक्ष्य को एप्लिकेशन के लॉग पर जांचना है, तो यह पोस्ट सीएमडी के भाग के रूप में टॉमकट शुरू करना और लॉग को सिलाई करना दिखाता है। टॉमकैट लॉग मेजबान पर 'डॉक लॉग्स कंटेनरिड' का उपयोग करके उपलब्ध है।

http://blog.trifork.com/2013/08/15/using-docker-to-efficiently-create-multiple-tomcat-instances/


0

कंटेनर चलाते समय यह उपयोगी असाइन नाम है। आपको कन्टेनर_ड की आवश्यकता नहीं है।

docker run --name container_name yourimage docker exec -it container_name bash


0

सबसे पहले, वांछित कंटेनर के कंटेनर आईडी प्राप्त करें

docker ps

आपको कुछ इस तरह मिलेगा:

CONTAINER ID        IMAGE                  COMMAND             CREATED             STATUS                          PORTS                    NAMES
3ac548b6b315        frontend_react-web     "npm run start"     48 seconds ago      Up 47 seconds                   0.0.0.0:3000->3000/tcp   frontend_react-web_1

अब इस कंटेनर आईडी को कॉपी करें और निम्न कमांड चलाएँ:

docker exec -it container_id sh

docker exec -it 3ac548b6b315 sh


-2

हो सकता है कि आप कंटेनरों को विकसित करते समय वीएम के संदर्भ में खुद को गलत समझ रहे थे। मेरी सलाह: करने की कोशिश नहीं।

कंटेनर किसी भी अन्य प्रक्रिया की तरह हैं। वास्तव में आप डिबगिंग के उद्देश्यों के लिए उन्हें "संलग्न" करना चाहते हैं (/ proc / env या स्ट्रेस -p के बारे में सोच सकते हैं) लेकिन यह एक बहुत ही खास मामला है।

आम तौर पर आप प्रक्रिया को केवल "रन" करते हैं, इसलिए यदि आप कॉन्फ़िगरेशन को संशोधित करना चाहते हैं या लॉग्स पढ़ना चाहते हैं, तो बस एक नया कंटेनर बनाएं और सुनिश्चित करें कि आप निर्देशिकाओं को साझा करके, स्टडआउट को लिखकर (इसलिए डॉक लॉग काम करता है) या कुछ इस तरह का।

डिबगिंग के उद्देश्यों के लिए आप एक शेल शुरू करना चाहते हैं, फिर अपना कोड, फिर शेल लैक्ट को छोड़ने के लिए CTRL-p + CTRL-q दबाएँ। इस तरह से आप का उपयोग कर पुनः प्राप्त कर सकते हैं:

docker attach <container_id>

यदि आप कंटेनर को डीबग करना चाहते हैं क्योंकि यह ऐसा कुछ कर रहा है जिसकी आप अपेक्षा नहीं करते हैं, तो इसे डीबग करने का प्रयास करें: /server/596994/how-can-i-debug-a-docker-converer -initialization


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

@ स्लीपपाइकल "कोई भी डेवलपर" थोड़ा पक्षपाती लगता है। किसी भी मामले में मैं प्रक्रियाओं के आत्मनिरीक्षण का उपयोग करता हूं इसलिए यही बात कंटेनरों पर भी लागू होती है। डिबगिंग के पीछे यही विचार है। आप डिबगर को प्रक्रिया में संलग्न करते हैं (जिसमें एक cli हो सकता है)। यह सोचकर कि आप "कंटेनर में लॉग इन" हैं, अभी भी मुझे गुमराह कर रहा है।
एस्टानी

-4

नहीं, यह संभव नहीं है। supervisordयदि आवश्यक हो तो एक ssh सर्वर प्राप्त करने के लिए कुछ का उपयोग करें । हालांकि, मैं निश्चित रूप से जरूरत पर सवाल उठाता हूं।

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