डॉकटर कंटेनर की फाइल सिस्टम की खोज


651

मैंने डॉकटर के साथ देखा है कि मुझे यह समझने की आवश्यकता है कि कंटेनर के अंदर क्या हो रहा है या वहां क्या फाइलें मौजूद हैं। एक उदाहरण डॉकटर इंडेक्स से छवियों को डाउनलोड कर रहा है - आपके पास कोई सुराग नहीं है कि छवि में क्या है इसलिए आवेदन शुरू करना असंभव है।

आदर्श क्या होगा जो उन्हें या समकक्ष समेटने में सक्षम हो। क्या ऐसा करने के लिए एक उपकरण है, या क्या मैं यह करने में सक्षम होना चाहिए यह सोचकर गलत करने की मेरी अवधारणा है।


13
डॉकर के नवीनतम संस्करणों में, ऐसा कुछ संभव है docker exec <container> bash:। तो, आप कंटेनर के अंदर एक खोल खोलें।
डैशोहोक्सा

7
कंटेनर पर बैश चलाना केवल तभी काम करता है जब कंटेनर के अंदर बैश स्थापित हो
क्रिस्टोफर थॉमस

7
इसी तरह, आप कर सकते हैं: docker exec <container> ls <dir path>और docker exec <container> cat <file path>। हालांकि बैश के लिए, -itविकल्प जोड़ें ।
नोआम मानोस

इसी तरह के सवाल: stackoverflow.com/questions/44769315/…
Vadzim

3
@ChristopherThomas, बिल्कुल। उसकी वजह से मैंने पाया है कि ऐसा करने का एकमात्र मजबूत तरीका docker image save image_name > image.tar@ Gaurav24 की प्रतिक्रिया के अनुसार है।
जैमे हैबटलज

जवाबों:


736

अद्यतन
सबसे आसान तरीका: docker निष्पादन का उपयोग करना

डॉकर संस्करण 1.3 या नया कमांड execउस कमांड का समर्थन करता है जो इसके समान व्यवहार करता है nsenter। यह कमांड पहले से चल रहे कंटेनर में नई प्रक्रिया चला सकता है (कंटेनर में PID 1 प्रक्रिया पहले से ही चल रही होगी)। आप /bin/bashकंटेनर स्थिति का पता लगाने के लिए दौड़ सकते हैं :

docker exec -t -i mycontainer /bin/bash

देख डोकर कमांड लाइन प्रलेखन

वैकल्पिक विधि 1
स्नैपशॉट

आप इस तरह से कंटेनर फाइल सिस्टम का मूल्यांकन कर सकते हैं:

# find ID of your running container:
docker ps

# create image (snapshot) from container filesystem
docker commit 12345678904b5 mysnapshot

# explore this filesystem using bash (for example)
docker run -t -i mysnapshot /bin/bash

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

आप बाद में स्नैपशॉट का उपयोग करके हटा सकते हैं (चल रहे कंटेनर का फाइल सिस्टम प्रभावित नहीं होता है!):

docker rmi mysnapshot

वैकल्पिक विधि 2
ssh

यदि आपको निरंतर पहुंच की आवश्यकता है, तो आप अपने कंटेनर में sshd स्थापित कर सकते हैं और sshd डेमन चला सकते हैं:

 docker run -d -p 22 mysnapshot /usr/sbin/sshd -D

 # you need to find out which port to connect:
 docker ps

इस तरह, आप अपने ऐप को ssh (कनेक्ट और निष्पादित करें जो आप चाहते हैं) का उपयोग करके चला सकते हैं।

अद्यतन: वैकल्पिक विधि 3
nsenter

उपयोग करें nsenter, https://web.archive.org/web/20160305150559/http://blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker/ देखें।

संक्षिप्त संस्करण है: nsenter के साथ, आप एक मौजूदा कंटेनर में एक शेल प्राप्त कर सकते हैं, भले ही वह कंटेनर SSH या किसी भी प्रकार के विशेष प्रयोजन के डेमॉन न चला हो


6
लेकिन ध्यान दें कि अगर आपको "docker cp" कमांड का उपयोग करने के लिए फ़ाइलों की आवश्यकता है उपयोग: docker cp कंटेनर: पथ HOSTPATH ​​फ़ाइलों / फ़ोल्डरों को कंटेनर फ़ाइल सिस्टम से होस्ट पथ पर कॉपी करें। पथ फाइल सिस्टम की जड़ के सापेक्ष हैं। # = docker cp 7bb0e258aefe: / etc / debian_version। # = docker cp ब्लू_फ्रॉग: / etc / होस्ट्स।
आमोस फोलारिन

4
विकल्प 4 इतना महत्वपूर्ण है कि इसे शीर्ष पर ले जाया जाना चाहिए और इसका नाम बदला जाना चाहिए Option 1
स्वचालित

5
@JanusTroelsen यदि कोई शेल नहीं है, तो आप इसे स्थापित कर सकते हैं - उदाहरण के लिए डॉकफाइल में अल्पाइन लिनेक्स (जिसके पास वास्तव में शेल नहीं है): RUN apk update && apk add bash(आकार: ~ 4MB)
कामिल कीलोस्वेस्की

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

1
विंडो के लिनक्स शेल का उपयोग करने के लिएdocker exec -t -i mycontainer /bin/sh
जेसन मास्टर्स

266

अद्यतन: प्रदर्शन!

इस कमांड को आपको एक रनिंग डॉकटर कंटेनर का पता लगाने देना चाहिए :

docker exec -it name-of-container bash

डॉकटर-कंपोज़ में इसके लिए समतुल्य होगा:

docker-compose exec web bash

(वेब इस मामले में सेवा का नाम है और इसमें डिफ़ॉल्ट रूप से ट्टी है।)

एक बार जब आप अंदर हैं:

ls -lsa

या किसी भी अन्य कमांड की तरह:

cd ..

इस कमांड से आपको डॉकटर छवि का पता लगाने देना चाहिए :

docker run --rm -it --entrypoint=/bin/bash name-of-image

एक बार अंदर करो:

ls -lsa

या किसी भी अन्य कमांड की तरह:

cd ..

-itइंटरैक्टिव ... और tty के लिए खड़ा है।


इस कमांड को आपको एक रनिंग डॉकटर कंटेनर या इमेज का निरीक्षण करने देना चाहिए :

docker inspect name-of-container-or-image

आप ऐसा करना चाह सकते हैं और पता कर सकते हैं कि क्या कोई है bashयाsh वहां है। जौनस रिटर्न में एंट्रीपॉइंट या सीएमडी देखें।

देखें डॉक्यूमेंट निष्पादित करें

देखिए डॉकटर-कंपोज़ एग्ज़ाम डॉक्यूमेंटेशन

देखें डॉकटर प्रलेखन का निरीक्षण करें


1
यह अत्यंत उपयोगी है, धन्यवाद! मुझे एक डॉक छवि फ़ाइल संरचना के अंदर निहित फ़ाइल को एक अनुप्रयोग में खींचने और छोड़ने की आवश्यकता है, लेकिन यह तब तक संभव नहीं होगा जब तक इसे जीयूआई प्रारूप में नहीं खोला जाएगा। किसी भी विचार कैसे मैं उस के आसपास काम कर सकता है?
अर्क्य चटर्जी 30:16

2
यह काफी स्पष्ट होना चाहिए कि यह केवल एक कंटेनर पर काम करेगा जिसने बैश स्थापित किया है।
सॉफ्टवेयर इंजीनियर

2
Windows कंटेनर / docker exec -ti <name> powershell
पॉवर्सशेल

1
@ मेरे कंटेनर / छवि में किसी कारण से इतना docker exec -ti <name> cmdकाम नहीं हुआ। और खुद के लिए अन्य newbies के लिए docker ps( उदाहरण के लिए 070494393ca5 की तरह कुछ) से कंटेनर उदाहरण उदाहरण का उपयोग करने के बजाय सुनिश्चित करें कि आपने इसे सौंपा था।
सिमोन_विवर

1
छवियों में के बारे में powershell github.com/aspnet/aspnet-docker/issues/362 - और आप केवल खिड़कियों छवियों पर कर्ल सकते हैं: blogs.technet.microsoft.com/virtualization/2017/12/19/...
Simon_Weaver

162

यदि आपका कंटेनर बंद हो गया है या उसके पास शेल नहीं है (उदाहरण के hello-worldलिए अधिष्ठापन गाइड में , या गैर-alpine traefik ) , तो यह संभवतया फाइल सिस्टम की खोज का एकमात्र संभव तरीका है।

आप अपने कंटेनर के फाइल सिस्टम को टार फाइल में संग्रहित कर सकते हैं:

docker export adoring_kowalevski > contents.tar

या फाइलों को सूचीबद्ध करें:

docker export adoring_kowalevski | tar t

ध्यान दें, कि छवि के आधार पर, इसमें कुछ समय और डिस्क स्थान लग सकता है।


12
मैं बस एक कंटेनर की सामग्री को सूचीबद्ध करना चाहता था जिसमें मानक UNIX उपकरण स्थापित नहीं है। exportऊपर दिए गए उदाहरण की भिन्नता इस मौके पर पहुंच गई:docker export adoring_kowalevski | tar tf -
बर्थो

3
अनिच्छुक को चेतावनी: यह बहुत अधिक डेटा (> जीबी) निर्यात कर सकता है और इसमें लंबा समय लग सकता है।
विंस बॉउड्रेन

5
@berto ऐसा नहीं है कि यह एक बड़ी बात है, लेकिन आपको f -अपने आदेश के अंत में आवश्यकता नहीं होनी चाहिए , टार डिफ़ॉल्ट रूप से मानक इनपुट से पढ़ता है। बस docker export adoring_kowalevski | tar tकाम करता है।
शॉन बोकैर्ट

बेहतर सरल; भयानक, टिप के लिए धन्यवाद! 🙌🏽
बर्ट

1
@ShaunBouckaert डिफ़ॉल्ट tar fकिसी के कॉन्फ़िगरेशन पर निर्भर है। एक भाग TAPEपर्यावरण चर है। दूसरों को निर्माण के हिस्से के रूप में नियंत्रित किया जाता है। शुद्ध प्रभाव है कि एक इसे पढ़ता है कभी नहीं मान लेना चाहिए है stdin या राईट stdout लेकिन हमेशा स्पष्ट रूप से इसे स्पष्ट करें।
रोज़ा

42

कंटेनर की फ़ाइल प्रणाली सामान्य रूप से / var / lib / docker में, docker के डेटा फ़ोल्डर में होती है। एक चालू कंटेनर फाइल सिस्टम को शुरू करने और निरीक्षण करने के लिए निम्नलिखित कार्य करें:

hash=$(docker run busybox)
cd /var/lib/docker/aufs/mnt/$hash

और अब वर्तमान कार्यशील निर्देशिका कंटेनर की जड़ है।


3
हालांकि इसमें कोई भी माउंटेड वॉल्यूम शामिल नहीं होगा।
hwjp

34

कंटेनर निर्माण से पहले:

यदि आप उस छवि की संरचना का पता लगाने के लिए जो कंटेनर के अंदर मुहिम की जाती है

sudo docker image save image_name > image.tar
tar -xvf image.tar

यह आपको एक छवि की सभी परतों की दृश्यता और उसके विन्यास की जानकारी देगा जो कि json फाइलों में मौजूद है।

कंटेनर निर्माण के बाद:

इसके लिए पहले से ही बहुत सारे उत्तर हैं। ऐसा करने का मेरा पसंदीदा तरीका होगा -

docker exec -t -i container /bin/bash


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

@MaximKulkin वास्तव में? यदि कंटेनर लिनक्स है, तो इससे कोई फर्क नहीं पड़ता कि मेजबान क्या है, अगर बैश उपलब्ध है। शायद आप विंडोज कंटेनर के बारे में सोच रहे हैं?
थोरबजोरन रावन एंडरसन

26

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

docker cp <container-name>:<path/inside/container> <path/on/host/>

Docker cp ( लिंक ) के लिए धन्यवाद आप सीधे कंटेनर से कॉपी कर सकते हैं क्योंकि यह आपके फाइलसिस्टम का कोई अन्य हिस्सा था। उदाहरण के लिए, एक कंटेनर के अंदर सभी फ़ाइलों को पुनर्प्राप्त करना:

mkdir /tmp/container_temp
docker cp example_container:/ /tmp/container_temp/

ध्यान दें कि आपको यह निर्दिष्ट करने की आवश्यकता नहीं है कि आप पुनरावर्ती कॉपी करना चाहते हैं।


6
यह अधिक + 1 का क्यों नहीं है! निश्चित रूप से सबसे अच्छा तरीका
निकोलस डिपियाज़ा

यह टार के माध्यम से निर्यात करने की तुलना में भी सरल है। मुझे फ़ाइलों का उपयोग करने के लिए -L को सिम्लिंक के माध्यम से प्राप्त करना था। कंटेनर को चलाने की आवश्यकता नहीं है!
MKaama

17

Ubuntu 14.04 पर डॉकटर 1.3.1 चल रहा है, मुझे निम्नलिखित निर्देशिका में मेजबान मशीन पर कंटेनर रूट फाइलसिस्टम मिला:

/var/lib/docker/devicemapper/mnt/<container id>/rootfs/

पूर्ण डॉकर संस्करण जानकारी:

Client version: 1.3.1
Client API version: 1.15
Go version (client): go1.3.3
Git commit (client): 4e9bbfa
OS/Arch (client): linux/amd64
Server version: 1.3.1
Server API version: 1.15
Go version (server): go1.3.3
Git commit (server): 4e9bbfa

एक आकर्षण की तरह काम करता है: नाम = <नाम> dockerId = $ (docker निरीक्षण -f {{.Id}} $ नाम) / var / lib / docker / devicemapper / mnt / $ dockerId / rootfs /
फ्लोरेंट

3
उबंटू 16.10 और डॉकटर 1.12.1 के साथ यह दुर्भाग्य से अब और नहीं (कोई devicemapperनिर्देशिका नहीं ) है। फ़ाइल के नीचे मौजूद है /var/lib/docker/overlay/<a sha256 apparently/<upper or merged>/...। मुझे यकीन नहीं है कि वहां फ़ाइलों को एक्सेस करना कितना पोर्टेबल / सुरक्षित है
WoJ

1
1.10 से शुरू होकर, डॉकर ने एक नया कंटेंट ऐड्रेसेबल स्टोरेज मॉडल पेश किया, जो बेतरतीब ढंग से उत्पन्न यूयूआईडी का उपयोग नहीं करता है, जैसा कि पहले लेयर और कंटेनर आइडेंटिफ़ायर दोनों के लिए था। नए मॉडल में यह परत आईडी के लिए एक सुरक्षित सामग्री हैश द्वारा प्रतिस्थापित किया गया है। तो यह तरीका अब काम नहीं करेगा।
आर्टेम डोलोबानको

यह पोर्टेबल नहीं है और स्टोरेज ड्राइवर की पसंद पर बहुत अधिक निर्भर करता है । सुनिश्चित नहीं है कि यदि समाधान direct-lvmउदाहरण के लिए काम करेगा ।
rustyx

14

प्रयोग करके देखें

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

ऐसी संभावना हो सकती है कि बैश को लागू नहीं किया गया है। उसके लिए आप उपयोग कर सकते हैं

docker exec -it <container-name> sh

12

मैं एक और गंदी चाल का उपयोग करता हूं जो कि aufs / devicemapper अज्ञेयवादी है।

मैं कमांड को देखता हूं कि कंटेनर उदाहरण के लिए चल रहा है docker ps और यदि यह एक अपाचे है या javaमैं सिर्फ निम्नलिखित काम करता हूं:

sudo -s
cd /proc/$(pgrep java)/root/

और voilá आप कंटेनर के अंदर हैं।

मूल रूप से आप रूट सीडी को /proc/<PID>/root/फ़ोल्डर में रख सकते हैं जब तक कि कंटेनर द्वारा प्रक्रिया को चलाया जाता है। उस मोड का उपयोग करने से सावधान सिमिलिंक समझ में नहीं आएगा।


इस विधि के बारे में अतिरिक्त जानकारी यहाँ: superuser.com/a/1288058/195840
एडुआर्डो लुसियो

12

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

कई कंटेनरों (विशेष रूप से जाने वाले) में कोई मानक बाइनरी (नहीं /bin/bashया /bin/sh) नहीं है। उस स्थिति में, आपको वास्तविक कंटेनर फ़ाइल को सीधे एक्सेस करने की आवश्यकता होगी:

एक जादू की तरह काम करता है:

name=<name>
dockerId=$(docker inspect -f {{.Id}} $name)
mountId=$(cat /var/lib/docker/image/aufs/layerdb/mounts/$dockerId/mount-id)
cd /var/lib/docker/aufs/mnt/$mountId

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


यह अब काम नहीं करता है। Devicemapper फ़ोल्डर वहाँ नहीं है।
0xcaff

यह अच्छा होगा यदि पुराने उत्तर वाले लोग उन्हें साफ करेंगे
मैथ्यू पर्डन

2
मैंने नए डॉकरों के स्टोरेज स्ट्रक्चर से मैच करने के लिए कमांड को अपडेट किया।
फ्लोरेंट

10

मेरे मामले में कंटेनर को छोड़कर किसी भी शेल का समर्थन नहीं किया गया था sh। तो, यह एक आकर्षण की तरह काम किया

docker exec -it <container-name> sh


5

यह छवि के लिए एक बैश सत्र शुरू करेगा:

docker run --rm -it --entrypoint = / bin / bash


1
यह तब उपयोगी होता है जब डिफ़ॉल्ट एंट्रीपॉइंट नहीं चलता है
22

4

मेरे लिए, यह अच्छी तरह से काम करता है (निर्देशिका / var / lib / docker / को इंगित करने के लिए अंतिम टिप्पणियों के लिए धन्यवाद ):

chroot /var/lib/docker/containers/2465790aa2c4*/root/

यहाँ, 2465790aa2c4 रनिंग कंटेनर की शॉर्ट आईडी है (जैसा कि docker ps द्वारा प्रदर्शित किया गया है ), इसके बाद एक स्टार है।


4

डॉकर के नए संस्करणों पर आप चला सकते हैं docker exec [container_name] जो आपके कंटेनर के अंदर एक शेल चलाता है

तो एक कंटेनर में सभी फाइलों की एक सूची प्राप्त करने के लिए बस चलाएं docker exec [container_name] ls


1
मैंने यह कोशिश की और यह काम नहीं किया। ऊपर खलील घरौई का सुझाव काम कर गया।
निक

मेरे लिए यही काम किया। आप छवि नाम के बजाय कंटेनर आईडी के साथ भी प्रयास कर सकते हैं
दिवान

4

Docker aufs ड्राइवर के लिए:

स्क्रिप्ट को कंटेनर रूट डीआईआर (टेस्ट डॉकटर 1.7.1 और 1.10.3 पर मिलेगा)

if [ -z "$1" ] ; then
 echo 'docker-find-root $container_id_or_name '
 exit 1
fi
CID=$(docker inspect   --format {{.Id}} $1)
if [ -n "$CID" ] ; then
    if [ -f  /var/lib/docker/image/aufs/layerdb/mounts/$CID/mount-id ] ; then
        F1=$(cat /var/lib/docker/image/aufs/layerdb/mounts/$CID/mount-id)
       d1=/var/lib/docker/aufs/mnt/$F1
    fi
    if [ ! -d "$d1" ] ; then
        d1=/var/lib/docker/aufs/diff/$CID
    fi
    echo $d1
fi

4

मौजूदा उत्तरों में से कोई भी एक कंटेनर के मामले को संबोधित करता है जो बाहर निकल गया है (और पुनः आरंभ नहीं किया जा सकता है) और / या उसके पास कोई शेल स्थापित नहीं है (जैसे डिस्ट्रोलेस वाले)। यह तब तक काम करता है जब तक आपके पास डोकर होस्ट के लिए रूट एक्सेस है।

एक वास्तविक मैनुअल निरीक्षण के लिए, पहले परत आईडी का पता लगाएं:

docker inspect my-container | jq '.[0].GraphDriver.Data'

आउटपुट में, आपको कुछ ऐसा देखना चाहिए

"MergedDir": "/var/lib/docker/overlay2/03e8df748fab9526594cfdd0b6cf9f4b5160197e98fe580df0d36f19830308d9/merged"

कंटेनर फ़ाइल सिस्टम की वर्तमान दृश्यमान स्थिति को खोजने के लिए इस फ़ोल्डर में (रूट के रूप में) नेविगेट करें।


3

यह उत्तर उन (जैसे अपने आप) को मदद करेगा जो कंटेनर नहीं चल रहा है, भले ही डॉक वॉल्यूम फ़ाइल सिस्टम का पता लगाना चाहते हैं।

सूची चलाने वाले डॉकटर कंटेनर:

docker ps

=> कंटेनर आईडी "4c721f1985bd"

अपनी स्थानीय भौतिक मशीन ( https://docs.docker.com/engine/tutorials/dockervolumes/ ) पर docker वॉल्यूम माउंट बिंदु देखें :

docker inspect -f {{.Mounts}} 4c721f1985bd

=> [{/ tmp / container-garren / tmp true rpStreet}]

यह मुझे बताता है कि स्थानीय भौतिक मशीन निर्देशिका / tmp / कंटेनर-गारेन को / tmp docker वॉल्यूम गंतव्य पर मैप किया जाता है।

स्थानीय भौतिक मशीन निर्देशिका (/ tmp / कंटेनर-ग्रेन) को जानने का मतलब है कि मैं फाइलसिस्टम का पता लगा सकता हूं कि क्या डॉकटर कंटेनर चल रहा है या नहीं। यह मुझे यह पता लगाने में मदद करने के लिए महत्वपूर्ण था कि कुछ अवशिष्ट डेटा था जो कंटेनर के चलने के बाद भी कायम नहीं रहना चाहिए था।


1
यह केवल एक स्थानीय निर्देशिका पाता है जो कंटेनर के अंदर वॉल्यूम के रूप में माउंट किया जाता है लेकिन कंटेनर के पूरे फाइल सिस्टम तक पहुंचने की अनुमति नहीं देता है।
बोजान कोमाज़ेक

3

एक और तरकीब यह है कि परमाणु उपकरण का उपयोग कुछ इस तरह करें:

mkdir -p /path/to/mnt && atomic mount IMAGE /path/to/mnt

आपके द्वारा इसका निरीक्षण करने के लिए डॉकर छवि को / पथ / / mnt पर आरोहित किया जाएगा ।


लेकिन आपको इसके लिए विशेष रूप से तैयार किए गए कंटेनरों की आवश्यकता है? हो सकता है कि आप इसे एक चेतावनी के रूप में जोड़ दें, क्योंकि अधिकांश लोग इसे समाधान के रूप में अपनी टीम / कंपनी को बेचने में सक्षम नहीं होंगे ...
एंजेलोस पिकोलस

3

केवल LINUX के लिए

सबसे सरल तरीका जो मैं उपयोग कर रहा था वह डीआईआर का उपयोग कर रहा था, जो कि कंटेनर है जो डॉक कंटेनर फाइलों का निरीक्षण करने के लिए चलना चाहिए।

  1. कंटेनर की प्रक्रिया आईडी (पीआईडी) का पता लगाएं और कुछ चर में स्टोर करें

    PID = $ (docker निरीक्षण -f '{{.State.Pid}}' अपना कंटेनर-नाम-यहाँ)

  2. सुनिश्चित करें कि कंटेनर प्रक्रिया चल रही है, और कंटेनर फ़ोल्डर में प्राप्त चर nameto का उपयोग करें

    cd / proc / $ PID / रूट

यदि आप इस लंबी कमांड का उपयोग करके पीआईडी ​​नंबर का पता लगाए बिना डीआईआर के माध्यम से प्राप्त करना चाहते हैं

cd /proc/$(docker inspect -f '{{.State.Pid}}' your-container-name-here)/root

सुझाव:

कंटेनर के अंदर जाने के बाद, आप जो कुछ भी करते हैं वह कंटेनर की वास्तविक प्रक्रिया को प्रभावित करेगा, जैसे कि सेवा को रोकना या पोर्ट नंबर को बदलना।

आशा है ये मदद करेगा

ध्यान दें:

यह विधि केवल तभी काम करती है जब कंटेनर अभी भी चल रहा है, अन्यथा यदि कंटेनर बंद या हटा दिया गया है, तो निर्देशिका अब मौजूद नहीं होगी


2

कंटेनर के अंदर क्या हो रहा है, यह समझने के लिए मेरा पसंदीदा तरीका है:

  1. एक्सपोज -p 8000

    docker run -it -p 8000:8000 image
    
  2. इसके अंदर सर्वर शुरू करें

    python -m SimpleHTTPServer
    

2

पहले से चल रहे कंटेनर के लिए, आप कर सकते हैं:

dockerId=$(docker inspect -f {{.Id}} [docker_id_or_name])

cd /var/lib/docker/btrfs/subvolumes/$dockerId

आपको उस dir में cd करने के लिए रूट होना चाहिए। यदि आप रूट नहीं हैं, तो कमांड चलाने से पहले 'sudo su' आज़माएं।

संपादित करें: v1.3 के बाद, जिरि का जवाब देखें - यह बेहतर है।


4
मैं "sudo su" के बजाय "sudo -i" के लिए दृढ़ता से आंशिक हूं क्योंकि एक suid प्रोग्राम को चलाने का बहुत कम कारण है जो एक और suid प्रोग्राम लॉन्च करता है जो एक शेल लॉन्च करता है। बीच के आदमी को काटो। :)
dannysauer

आपका उत्तर बहुत अच्छा है, केवल रास्ता नहीं है। आपको पियर्सबॉट के रास्ते का उपयोग करना चाहिए।
फ्लोरेंट

2

यदि आप Docker v19.03 का उपयोग कर रहे हैं, तो आप नीचे दिए चरणों का पालन करें।

# find ID of your running container:

  docker ps

# create image (snapshot) from container filesystem

  docker commit 12345678904b5 mysnapshot

# explore this filesystem 

  docker run -t -i mysnapshot /bin/sh

1

यदि आप AUFS स्टोरेज ड्राइवर का उपयोग कर रहे हैं, तो आप किसी भी कंटेनर के फाइलसिस्टम रूट (mnt) और रीडराइट परत को खोजने के लिए मेरे डॉक -लेयर स्क्रिप्ट का उपयोग कर सकते हैं :

# docker-layer musing_wiles
rw layer : /var/lib/docker/aufs/diff/c83338693ff190945b2374dea210974b7213bc0916163cc30e16f6ccf1e4b03f
mnt      : /var/lib/docker/aufs/mnt/c83338693ff190945b2374dea210974b7213bc0916163cc30e16f6ccf1e4b03f

संपादित करें 2018-03-28: डॉक
-परत को डॉक -बैकअप द्वारा बदल दिया गया है


1

docker execआदेश एक चल कंटेनर में एक कमांड को चलाने के लिए कई मामलों में कर सकते हैं।

उपयोग: कर्ता निष्पादन [विकल्प] कंटेनर कमान [ARG ...]

एक रनिंग कंटेनर में एक कमांड चलाएँ

विकल्प:
  -d, --detach डिटैच मोड: पृष्ठभूमि में रन कमांड
      -detach- कीज़ स्ट्रिंग एक को अलग करने के लिए प्रमुख अनुक्रम को ओवरराइड करती है
                             पात्र
  -e, --env सूची पर्यावरण चर सेट करें
  -आई, - इन्टेक्टिव एक्टिव स्टैडिन को खुला रखें भले ही वह अटैच न हो
      - विशेषाधिकार प्राप्त कमांड को विस्तारित विशेषाधिकार दें
  -t, - शेट्टी एक छद्म-TTY आवंटित करें
  -u, --user string उपयोगकर्ता नाम या UID (प्रारूप:
                             [:])
  -w, --workdir string कंटेनर के अंदर कार्यशील निर्देशिका

उदाहरण के लिए :

1) चलने वाले कंटेनर फाइल सिस्टम में बैश में पहुंचना:

docker exec -it containerId bash 

2) आवश्यक अधिकारों के लिए सक्षम होने के लिए रूट के रूप में चल रहे कंटेनर फाइल सिस्टम में बैश में पहुंचना:

docker exec -it -u root containerId bash  

यह विशेष रूप से एक कंटेनर में रूट के रूप में कुछ प्रसंस्करण करने में सक्षम होने के लिए उपयोगी है।

3) एक विशिष्ट कार्य निर्देशिका के साथ चल रहे कंटेनर फाइल सिस्टम में बैश में पहुंचना:

docker exec -it -w /var/lib containerId bash 

0

आप इसके साथ कंटेनर के अंदर बैश चला सकते हैं: $ docker run -it ubuntu /bin/bash

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