डॉकटर कंटेनर में होस्ट निर्देशिका कैसे माउंट करें


617

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

मैं कहां कुछ गलत कर रहा हूं। मैंने जो किया था यह रहा:

kishore$ cat Dockerfile

FROM ubuntu:trusty
RUN apt-get update
RUN apt-get -y install git curl vim
CMD ["/bin/bash"]
WORKDIR /test_container
VOLUME ["/test_container"]

kishore$ tree
.
├── Dockerfile
└── main_folder
    ├── tfile1.txt
    ├── tfile2.txt
    ├── tfile3.txt
    └── tfile4.txt

1 directory, 5 files kishore$ pwd /Users/kishore/tdock

kishore$ docker build --tag=k3_s3:latest .

Uploading context 7.168 kB
Uploading context
Step 0 : FROM ubuntu:trusty
 ---> 99ec81b80c55
Step 1 : RUN apt-get update
 ---> Using cache
 ---> 1c7282005040
Step 2 : RUN apt-get -y install git curl vim
 ---> Using cache
 ---> aed48634e300
Step 3 : CMD ["/bin/bash"]
 ---> Running in d081b576878d
 ---> 65db8df48595
Step 4 : WORKDIR /test_container
 ---> Running in 5b8d2ccd719d
 ---> 250369b30e1f
Step 5 : VOLUME ["/test_container"]
 ---> Running in 72ca332d9809
 ---> 163deb2b1bc5
Successfully built 163deb2b1bc5
Removing intermediate container b8bfcb071441
Removing intermediate container d081b576878d
Removing intermediate container 5b8d2ccd719d
Removing intermediate container 72ca332d9809

kishore$ docker run -d -v /Users/kishore/main_folder:/test_container k3_s3:latest c9f9a7e09c54ee1c2cc966f15c963b4af320b5203b8c46689033c1ab8872a0ea

kishore$ docker run -i -t k3_s3:latest /bin/bash

root@0f17e2313a46:/test_container# ls -al
total 8
drwx------  2 root root 4096 Apr 29 05:15 .
drwxr-xr-x 66 root root 4096 Apr 29 05:15 ..

root@0f17e2313a46:/test_container# exit exit

kishore$ docker -v
Docker version 0.9.1, build 867b2a9

  • मैं बूट 2docker संस्करण की जांच करना नहीं जानता

प्रश्न, मुद्दों का सामना:

  1. मुझे do_ कंटेनर के अंदर मौजूद test_container फ़ोल्डर में main_folder को कैसे लिंक करना है?
  2. मुझे इसे स्वचालित रूप से बनाने की आवश्यकता है। मैं वास्तव में run -d -vकमांड का उपयोग किए बिना ऐसा कैसे कर सकता हूं ?
  3. यदि बूट 2docker क्रैश हो जाता है तो क्या होता है? डॉकर फ़ाइलों को कहाँ संग्रहीत किया जाता है (डॉकरफाइल के अलावा)?

2
FYI करें, यह इस टिप्पणी के रूप में docker में तय किया गया लगता है। मैं अपने मैक पर boot2docker का उपयोग कर रहा हूं। मैं -v विकल्प का उपयोग कर सकता हूं और मेरी स्थानीय निर्देशिका कंटेनर में सभी तरह से घुड़सवार हो जाती है।
मार्को

जवाबों:


508

कुछ तरीके हैं जिनसे आप यह कर सकते हैं। ऐसा करने का सबसे सरल तरीका डॉकफाइल ADDकमांड का उपयोग करना है:

ADD . /path/inside/docker/container

हालांकि, डॉकटर के निर्माण के बाद होस्ट पर इस निर्देशिका में किए गए कोई भी परिवर्तन कंटेनर में दिखाई नहीं देंगे। ऐसा इसलिए है क्योंकि कंटेनर बनाते समय, डॉकटर डायरेक्टरी को एक में कम्प्रेस करता है .tarऔर उस संदर्भ को कंटेनर में स्थायी रूप से अपलोड करता है

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

docker run -v /host/directory:/container/directory -other -options image_name command_to_run

मैंने इस किशोर $ docker -v / Users / kishore / main_folder: / test_container Docker संस्करण 0.9.1 की कोशिश की, 867b2a9 किशोर $ docker रन -v / उपयोगकर्ताओं / किशोर / main_folder का निर्माण करें: / test_container उपयोग: docker चलाने [विकल्प] COMMAND] [ARG ...] एक नए कंटेनर में एक कमांड चलाएँ-, --publish-all = false: होस्ट किए गए इंटरफेस में सभी उजागर पोर्ट्स प्रकाशित करें -a, --attach = []: स्टड, स्टडआउट या संलग्न करें stderr। -सी, - सीपीयू-शेयर = ०: सीपीयू शेयर (सापेक्ष वजन)
किशोर वैष्णव

2
क्या आपके पास दोनों ए.डी.डी. और -v वॉल्यूम एक ही समय में माउंट होता है। यदि कोई होस्ट माउंट निर्दिष्ट नहीं है, तो डिफ़ॉल्ट app_dir का उपयोग करना?
अलेक्सज

@alexzg मुझे नहीं लगता कि हम केवल पहले वाले को ही वरीयता दे सकते हैं। इसके अलावा, मैं आपके दूसरे बिंदु डिफ़ॉल्ट app_dir ... होस्ट माउंट के बारे में स्पष्ट नहीं हूं?
किशोर वैष्णव

35
यह मेरे लिए मैक ओएस एक्स पर डॉकटर-मशीन और वर्चुअलबॉक्स के साथ काम करता है। परीक्षण और त्रुटि से मुझे पता चला कि एक कैविएट यह है कि मेजबान निर्देशिका को एक पूर्ण पथ होना चाहिए न कि एक सापेक्ष पथ।
jbustamovej

24
ADDवास्तव में "बढ़ते" नहीं है यह फ़ाइल को कंटेनर में रखता है जो इसे अंदर बनाए रखता है।
केवि।

200

इस प्रश्न का उपयोगकर्ता उपयोग कर Docker version 0.9.1, build 867b2a9रहा था , मैं आपको docker version> = 17.06 का उत्तर दूंगा।

आप जो चाहते हैं, स्थानीय निर्देशिका को कंटेनर निर्देशिका में समन्‍वयित रखें, मात्रा के साथ बढ़ते हुए पूरा किया जाता है bind। यह स्रोत (आपके सिस्टम) और लक्ष्य (docker कंटेनर में) निर्देशिका को बाइंड करेगा। यह लिनक्स पर एक निर्देशिका बढ़ते के रूप में लगभग एक ही है।

डॉकर प्रलेखन के अनुसार , माउंट करने के लिए उपयुक्त कमांड अब mountइसके बजाय है -v। यहाँ इसका प्रलेखन है:

  • --mount: कॉमा द्वारा अलग किए गए कई कुंजी-मूल्य जोड़े के होते हैं। प्रत्येक कुंजी / मान युग्म टुप का रूप लेता है <key>=<value>--mountसिंटेक्स की तुलना में वर्बोज़ अधिक है -vया --volumeहै, लेकिन चाबियों का क्रम महत्वपूर्ण नहीं है, और ध्वज के मान को समझने के लिए आसान है।

  • typeमाउंट है, जो हो सकता है की bind, volume, या tmpfs(हम बाँध का उपयोग करने जा रहे हैं )

  • sourceके माउंट। बाइंड माउंट्स के लिए, यह फाइल या डॉकरे डेमन होस्ट पर डायरेक्टरी का मार्ग है। के रूप में निर्दिष्ट किया जा सकता sourceया src

  • destinationअपने मूल्य के रूप में पथ जहाँ फ़ाइल या निर्देशिका कंटेनर में रखा हो जाएगा ले जाता है। के रूप में निर्दिष्ट किया जा सकता हैdestination , dstया target

इसलिए, वर्तमान निर्देशिका (स्रोत) को /test_container(लक्ष्य) के साथ माउंट करने के लिए जिसका हम उपयोग करने जा रहे हैं:

    docker run -it --mount src="$(pwd)",target=/test_container,type=bind k3_s3

यदि इन माउंट पैरामीटर में रिक्त स्थान हैं, तो आपको उनके चारों ओर उद्धरण रखना होगा। जब मुझे पता है कि वे नहीं करते हैं, तो मैं उपयोग करूंगा`pwd` इसके बजाय का :

    docker run -it --mount src=`pwd`,target=/test_container,type=bind k3_s3

आपको फ़ाइल अनुमति से भी निपटना होगा, इस लेख को देखें


2
मैंने आपके उत्तर को गलत माना है क्योंकि मुझे यह पसंद है कि यह कितना संक्षिप्त है और यह गलत नहीं है, लेकिन आप stackoverflow.com/a/51829247/901899
rainabba

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

1
@ सिट्टी में निम्नलिखित बातों का जिक्र हो सकता है: " यदि आप नए डॉकर एप्लिकेशन विकसित कर रहे हैं, तो इसके बजाय नामित संस्करणों का उपयोग करने पर विचार करें । आप सीधे
डॉक

81

2 क्रमिक mounts: मुझे लगता है कि यहां कई पोस्ट दो boot2docker का उपयोग कर रही हो सकती हैं, इसका कारण यह है कि आपको कुछ भी दिखाई नहीं देता है कि आप boot2docker से एक निर्देशिका बढ़ा रहे हैं, अपने होस्ट से नहीं।

आपको मूल रूप से 2 क्रमिक mounts की आवश्यकता है:

अपने सिस्टम से अपने मेजबान से एक निर्देशिका माउंट करने वाला पहला

इस तरह अपने कंटेनर में boot2docker से नई निर्देशिका माउंट करने के लिए दूसरा:

  • 1) माउंट स्थानीय प्रणाली पर boot2docker

    sudo mount -t vboxsf hostfolder /boot2dockerfolder
    
  • 2) boot2dockerलिनक्स कंटेनर पर माउंट फ़ाइल

    docker run -v /boot2dockerfolder:/root/containerfolder -i -t imagename
    

फिर जब आप lsअंदर होंगे तो containerfolderआपको अपनी सामग्री दिखाई देगी hostfolder


1
सबसे बढ़िया उत्तर। मुझे माउंट कमांड में उस (विंडोज़ के तहत) होस्टफ़ोल्डर को एक फ़ोल्डर साझा नाम से जोड़ना है । वह जो विंडोज़ टर्मिनल (cmd) के अंदर एक कमांड के साथ दिखाई देता है । और आपको वर्चुअलबॉक्स GUI के साथ एक साझा फ़ोल्डर के रूप में उस एक को जोड़ना होगा (यदि आप मेरे तर्क का पालन करते हैं तो उसी नाम का उपयोग करें)। यदि आप इसे साझा करना छोड़ देते हैं, तो यह काम करेगा, लेकिन आप अनुमतियों और ताज़ा प्रदर्शन के साथ समस्याओं का सामना करेंगे। net share
किरो कानोस

माउंट कमांड को कैसे पता चलता है कि होस्ट / boot2dockerfolder कहां है?
अल्फोंसोडेव

मुझे त्रुटि मिली: mount: unknown filesystem type 'vboxsf'एक ubuntu अतिथि और मेजबान का उपयोग करते हुए
nnyby

"vboxsf" वर्चुअलबॉक्स साझा-फ़ोल्डर "फ़ाइल सिस्टम" ड्राइवर है। वर्चुअलबॉक्स एक्सटेंशन स्थापित करके इसे वीएम में कॉन्फ़िगर किया जाना चाहिए। Boot2docker छवि में ये संस्थापित नहीं होना चाहिए। वर्चुअलबॉक्स में वर्चुअल वॉल्यूम के रूप में वर्चुअलबॉक्स एडिशंस आईएसओ इमेज को "इंसर्ट" करने का एक "डिवाइस" फंक्शन है। आमतौर पर आप इसे माउंट / देव / cdrom / mnt का उपयोग करके माउंट कर सकते हैं, / mnt में जा सकते हैं और बैश VBoxLinuxAdditions चला सकते हैं। इसे gcc, कर्नेल या अन्य निर्भरता की स्थापना की आवश्यकता हो सकती है।
एंड्रयू वोल्फ

Mount.vboxsf: बढ़ते त्रुटि के साथ विफल: ऐसी कोई फ़ाइल या निर्देशिका माउंट नहीं: बढ़ते mymapfoldername / boot2dockerfolder पर विफल: ऐसी कोई फ़ाइल या निर्देशिका नहीं है
vee

71

आप -i विकल्प को cli से उपयोग कर सकते हैं, यह सुविधा Dockerfile के माध्यम से उपलब्ध नहीं है

docker run -t -i -v <host_dir>:<container_dir> ubuntu /bin/bash

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

यदि आप host_dir में होस्ट मशीन (रूट विशेषाधिकार के तहत) से कोई बदलाव करते हैं तो यह कंटेनर और इसके विपरीत दिखाई देगा।


6
मेजबान माउंट विकल्प को चित्रित करने के लिए एक अच्छा, साफ, टू-द-पॉइंट उदाहरण क्या है। यह शायद असली निर्देशिका का उपयोग करके सुधार किया जा सकता है: docker run -t -i -v /tmp:/tmp ubuntu /bin/bashजहां मेजबान /tmpकंटेनर पर रखा जाएगा /tmp। अब touch /tmp/hello-worldकंटेनर से एक और होस्ट पर फ़ाइल दिखाई दे सकती है।
स्टीफन हेन्सिंगेन

3
सही काम करता है। लेकिन इस तरह बढ़ते हुए डायरेक्टरी के मालिक को रूट के रूप में सेट करता है और यह भी कंटेनर को रूट के रूप में चलाने की उम्मीद करता है। जब कंटेनर को नॉन-रूट के रूप में चलाया जाता है तो हम गैर-रूट को गैर-रूट कैसे माउंट करते हैं?
अरुण

33

क्या यह संभव है कि आप ओएस एक्स के माध्यम से boot2dockerया कुछ इसी तरह का उपयोग करते हैं।

मैंने एक ही अनुभव किया है - कमांड सही है लेकिन कुछ भी नहीं (समझदार) कंटेनर में रखा गया है, वैसे भी।

जैसा कि यह पता चला है - यह पहले से ही docker प्रलेखन में समझाया गया है । जब आप टाइप करते हैं docker run -v /var/logs/on/host:/var/logs/in/container ...तो /var/logs/on/hostवास्तव में boot2dockerVM-image से मैप किया जाता है , न कि आपके मैक से।

आपको अपने वीएम के माध्यम से अपने वास्तविक होस्ट (मेरे मामले में मैक) के माध्यम से साझा फ़ोल्डर को पाइप करना होगा।


1
धन्यवाद! इससे मुझे दूर की समस्या से निपटने में मदद मिली। डॉकर के अंदर चलने वाले पोस्टग्राउंड्स VBox IP से बंधे थे, न कि लोकलहोस्ट, क्योंकि OS X पर नहीं चलने पर ऐसा होता।
पीटर बेइच

2
डॉक्यूमेंट डॉक्यूमेंटेशन का वह URL अब मान्य नहीं है
digitaldavenyc

haha सबसे अच्छा मजाक कभी .. वे वास्तव में एक संकेत या तो कर सकते थे।
user2834172

2
आपका दस्तावेज़ीकरण लिंक एक 404 है
फैक्टर मिस्टिक

3
मैं वीएम के माध्यम से वास्तविक फ़ोल्डर में साझा किए गए फ़ोल्डर को पाइप करने का एक उदाहरण देखने के लिए उत्सुक हूं।
डेरेक

28

[अद्यतन] ~ जून २०१ As के अनुसार, मैक के लिए डोकर इस के सभी कष्टप्रद भागों का ध्यान रखता है जहां आपको वर्चुअलबॉक्स के साथ गड़बड़ करना है। यह आपको /privateउपसर्ग का उपयोग करके मूल रूप से आपके स्थानीय होस्ट पर सब कुछ मैप करने देता है । अधिक जानकारी यहाँ[/अपडेट करें]

सभी मौजूदा उत्तर Boot2docker के बारे में बात करते हैं। चूँकि अब डॉकटर-मशीन के पक्ष में पदावनत किया गया है, यह डॉकटर-मशीन के लिए काम करता है:

सबसे पहले, docker- मशीन vm में ssh करें और उस फ़ोल्डर को बनाएँ जिसे हम मैप कर रहे हैं:

docker-machine ssh $MACHINE_NAME "sudo mkdir -p \"$VOL_DIR\""

अब VirtualBox को फ़ोल्डर साझा करें:

WORKDIR=$(basename "$VOL_DIR")
vboxmanage sharedfolder add "$MACHINE_NAME" --name "$WORKDIR" --hostpath "$VOL_DIR" --transient

अंत में, दोबारा docker- मशीन में ssh और हमारे द्वारा साझा किए गए फ़ोल्डर को माउंट करें:

docker-machine ssh $MACHINE_NAME "sudo mount -t vboxsf -o uid=\"$U\",gid=\"$G\" \"$WORKDIR\" \"$VOL_DIR\""

नोट: UID और GID के लिए आप मूल रूप से जब तक वे पहले से ही नहीं ले जाते हैं, तब तक पूर्णांक का उपयोग कर सकते हैं।

यह OS X El Capitan पर docker- मशीन 0.4.1 और docker 1.8.3 के रूप में परीक्षण किया गया है।


1
+1। मेरे सिर को पीटने के कई घंटों के बाद, आपके जवाब ने काम किया। यह docker-machineडॉक्टर का हिस्सा होना चाहिए ।
अभिजीत सरकार

-vझंडे का इस्तेमाल क्यों नहीं ?
.ग्रेसिया

1
@igracia -vझंडा ऐसे काम नहीं करता जैसे आप OS X (या विंडोज़) में अपेक्षा करते हैं। डॉकर एक वीएम में चलता है इसलिए फ़ोल्डर -vवीएम में रूट फ़ोल्डर में पॉइंट में संदर्भित होता है , रूट ओएस में नहीं। यह तकनीक VM फ़ोल्डर को रूट ओएस पर वापस मैप करने का अगला चरण लेती है।
पैट्रिक गुंडरसन

1
@PatrickGunderson मेरे मामले में (OS X) फ़ोल्डर होस्ट में है, VM में नहीं है, और यह ठीक काम करता है। डॉकर टोल इसे वीएम को निर्यात करने का ध्यान रखते हैं, और वहां से कंटेनर में ले जाते हैं।
.ग्रेसिया २०'१६ को ig:१

1
नियम का एक अपवाद मैंने उल्लेख किया है कि वीएम स्वचालित रूप /Usersसे डॉकटर को साझा करने के लिए माउंट करेगा । इसका मतलब है कि अगर आपकी काम करने वाली फाइलें हैं, ~/*तो आप जाने के लिए अच्छे हैं। आप अपने देव वातावरण से बाहर चलाने के लिए सेटअप है, तो /developmentया अन्य की तुलना में कुछ भी /Usersयदि समस्या वाले हैं docs.docker.com/engine/userguide/containers/dockervolumes
पैट्रिक Gunderson

27

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

मैं अपने SailsJS / NodeJS एप्लिकेशन को / एप्लिकेशन के तहत माउंट करने के लिए निम्न आदेश का उपयोग कर रहा हूं:

cd my_source_code_folder
docker run -it -p 1337: 1337 -v $ (pwd): / app my_docker / image_with_nodejs_etc

5
डॉकरीफाइल में यह कैसे हो सकता है?
22

23
docker run -v /host/directory:/container/directory -t IMAGE-NAME /bin/bash

docker run -v /root/shareData:/home/shareData -t kylemanna/openvpn /bin/bash

मेरे सिस्टम में मैंने nhjk से उत्तर को सही किया है, जब आप -tझंडा जोड़ते हैं तो यह निर्दोष काम करता है ।


क्या आप लोकल एफएस से फाइल बनाने / अपडेट करने और डॉकटर कंटेनर के अंदर बदलाव देखने में सक्षम हैं?
एवी मेहेंवाल 12

14

यदि मेजबान विंडोज़ 10 है तो फॉरवर्ड स्लैश के बजाय, बैकवर्ड स्लैश का उपयोग करें -

docker run -it -p 12001:80 -v c:\Users\C\Desktop\dockerStorage:/root/sketches

सुनिश्चित करें कि होस्ट ड्राइव साझा किया गया है (इस मामले में सी)। मेरे मामले में, मुझे ऊपर कमांड चलाने के बाद शेयर की अनुमति मांगने का संकेत मिला।


13

मैक ओएस पर, /Users/<name>/projects/अपने कंटेनर के रूट पर अपने मैक पर एक फ़ोल्डर माउंट करने के लिए :

docker run -it -v /Users/<name>/projects/:/projects <container_name> bash

ls /projects


11

जुलाई 2015 अद्यतन - boot2docker अब सीधे बढ़ते का समर्थन करता है। आप -v /var/logs/on/host:/var/logs/in/containerअपने मैक प्रॉम्प्ट से सीधे डबल माउंटिंग के बिना उपयोग कर सकते हैं


11

के लिए Windows 10 उपयोगकर्ताओं, इसके अंदर माउंट बिंदु जरूरी है C:/Users/निर्देशिका। मैंने इसे काम करने के लिए घंटों कोशिश की। इस पोस्ट ने मदद की लेकिन यह पहली बार में स्पष्ट नहीं था क्योंकि विंडोज 10 के लिए समाधान एक स्वीकृत उत्तर के लिए एक टिप्पणी है। मैंने इस तरह से इसे किया:

docker run -it -p 12001:80 -v //c/Users/C/Desktop/dockerStorage:/root/sketches \
<your-image-here> /bin/bash

फिर इसका परीक्षण करने के लिए, आप echo TEST > hostTest.txtअपनी छवि के अंदर कर सकते हैं । आपको स्थानीय होस्ट फ़ोल्डर में इस नई फ़ाइल को देखने में सक्षम होना चाहिए C:/Users/C/Desktop/dockerStorage/


रास्ते पर आने वाली दोहरी मार ने मेरे लिए काम कर दिया। यह भ्रामक था क्योंकि मैंने -v $(pwd):/var/xxपहले प्रयोग किया था और यह काम किया था, लेकिन एक खाली निर्देशिका के परिणामस्वरूप। मैं बाबुन के माध्यम से साइबर चला रहा हूं।
केंचिलाडा

विंडोज 7 में एक ही मुद्दा था / c / data / का उपयोग करते समय, होस्ट डायरेक्टरी को / c / Users / <user> के तहत ले जाना / इसे मेरे लिए हल करना। धन्यवाद।
user8675309

1
क्या हमारे पास उस पोस्ट का लिंक हो सकता है जिससे आपको समस्या हल करने में मदद मिली हो?
पीबीओ

11

मैं एक ही मुद्दा रहा है। मेरी कमांड लाइन इस तरह दिखती है:

docker run --rm -i --name $NAME -v `pwd`:/sources:z $NAME

समस्या d पीडीडब्ल्यू ’को लेकर थी। इसलिए मैंने इसे $ (pwd) में बदल दिया:

docker run --rm -i --name $NAME -v $(pwd):/sources:z $NAME

1
किसलिए है z?
hhh

2
Z विकल्प इंगित करता है कि बाइंड माउंट सामग्री कई कंटेनरों के बीच साझा की गई है।
जेसन

10

डॉकर 18-सीई के रूप में, आप docker run -v /src/path:/container/pathहोस्ट फ़ोल्डर के 2-वे बाइंडिंग करने के लिए उपयोग कर सकते हैं ।

यहां एक बड़ी पकड़ है, हालांकि अगर आप विंडोज 10 / डब्लूएसएल के साथ काम कर रहे हैं और आपके डॉक्यूमेंट को डब्लूएस-सीई के पास अपने होस्ट के रूप में और फिर डब्लूएस-सी क्लाइंट टूल्स डब्ल्यूएसएल में हैं। WSL पूरे / फाइल सिस्टम के बारे में जानता है जबकि आपका विंडोज होस्ट केवल आपके ड्राइव के बारे में जानता है। WSL के अंदर, आप / mnt / c / projectpath का उपयोग कर सकते हैं, लेकिन यदि आप प्रयास करते हैं docker run -v ${PWD}:/projectpath, तो आप होस्ट में पाएंगे कि / projectpath / खाली है क्योंकि host / mnt का अर्थ कुछ भी नहीं है।

यदि आप / c / प्रोजेक्टपथ से काम करते हैं और फिर भी करते हैं docker run -v ${PWD}:/projectpathऔर आपको लगता है कि कंटेनर में, / projectpath वास्तविक समय में / c / प्रोजेक्टपथ को प्रतिबिंबित करेगा। इस समस्या का पता लगाने के लिए कोई त्रुटि या कोई अन्य तरीके नहीं हैं, अपने अतिथि के अंदर खाली mounts देखने के अलावा।

आपको विंडोज सेटिंग्स के लिए डॉकर में "ड्राइव साझा करने" के लिए भी सुनिश्चित होना चाहिए।


मुझे यह समस्या Win10 / WSL और Docker-CE / docker-ce से है। खाली / प्रोजेक्टपथ /। आपको "सी / प्रोजेक्ट / प्रोजेक्टपथ से काम" से क्या मतलब है? मैंने / c / को / mnt / c से लिंक करने और चलाने की कोशिश की, /c/projectpathलेकिन फिर मुझे त्रुटि मिली bind mount source path does not exist: /host_mnt/c/projectpath
स्टीवन टी। स्नाइडर

इस लिंक ने मेरी समस्या हल कर दी: support.divio.com/local-development/docker/… (विंडोज पर डॉकर केवल / उपयोगकर्ताओं / डिफ़ॉल्ट रूप से बढ़ते रहने की अनुमति देता है)
स्टीवन टी। स्नाइडर

7

मैंने पाया कि कोई भी डायरेक्टरी जैसे सिस्टम के निर्देशन में काम कर रही है /var , /usr, /etcकंटेनर के नीचे नहीं माउंट जा सकता है।

निर्देश उपयोगकर्ता के अंतरिक्ष -vस्विच पर होना चाहिए , उदाहरण के लिए, कंटेनर में स्थानीय निर्देशिका को माउंट करने के लिए docker डेमन को निर्देश देता है:

docker run -t -d -v /{local}/{path}:/{container}/{path} --name {container_name} {imagename}

5

VirtualBox अतिथि परिवर्धन के साथ boot2docker
कैसे boot2docker में / उपयोगकर्ताओं को माउंट करने के लिए

https://medium.com/boot2docker-lightweight-linux-for-docker/boot2docker-together-with-virtualbox-guest-additions-da1e3ab2465c

tl; dr अपने खुद के कस्टम बूट 2docker.iso का निर्माण VirtualBox अतिथि अतिरिक्त ( लिंक देखें ) के साथ करें या http://static.dockerfiles.io/boot2docker-v1.0.1-virtualbox-guest-additions-v4.3.12.iso और इसे सहेजें को ~ / .boot2docker / boot2docker.iso


मैंने उस आईएसओ का उपयोग करने की कोशिश की और मैं अभी भी उसी समस्याओं में भाग गया ... उस पोस्ट में उल्लिखित निर्देशों का उपयोग करने से मुझे इसे हल करने में मदद मिली हालांकि - मुझे मूल रूप से साझा फ़ोल्डर को मजबूर करना पड़ा।
जैको प्रीटोरियस

मैंने iso का उपयोग किया, यह इस बात में लड़खड़ा गया कि मैंने 'VBoxManage sharedfolder add ...' cmd को कॉल करने से पहले वर्चुअल बॉक्स VM को नहीं रोका। अंत में यह सब काम कर रहा है, हालांकि बहुत बड़ा धन्यवाद।
एमिल

नोट: कारण -v arg doens't boot2docker के माध्यम से काम नहीं करेगा, यह स्पष्ट रूप से कुछ ऐसा करने के लिए है जो boot2docker-vm पर बढ़ता है और आपके वास्तविक होस्ट के लिए नहीं। जिसके कारण मुझे लगता है कि Vboxmanage हिस्सा इसे काम करने में मदद करता है।
एमिल

5

मैं do_ कंटेनर के अंदर मौजूद test_container फ़ोल्डर में main_folder को कैसे लिंक करूं?

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

docker run -d -v /Users/kishore/main_folder:/test_container k3_s3:latest

मुझे यह रन अपने आप बनाने की जरूरत है, कैसे करें कि वास्तव में रन -v कमांड का उपयोग किए बिना।

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

अगर बूट 2 डॉक क्रैश हो जाता है तो क्या होगा? Docker फ़ाइलें कहाँ संग्रहीत की जाती हैं?

यदि आप -v arg का उपयोग करने का प्रबंधन करते हैं और अपनी होस्ट मशीन को संदर्भित करते हैं तो फाइलें आपके होस्ट पर सुरक्षित रहेंगी।

यदि आपने 'docker build -t myimage' का उपयोग किया है। Dockerfile के साथ तब आपकी फ़ाइलें छवि में बेक हो जाएंगी।

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


5

एक ही समस्या थी। डॉक्यूमेंट डॉक्यूमेंटेशन में यह पाया :

नोट: होस्ट निर्देशिका, इसकी प्रकृति, होस्ट-निर्भर है। इस कारण से, आप Dockerfile से होस्ट डायरेक्टरी को माउंट नहीं कर सकते, VOLUME निर्देश होस्ट-डीआईआर पास करने का समर्थन नहीं करता है, क्योंकि निर्मित छवियां पोर्टेबल होनी चाहिए। एक मेजबान निर्देशिका सभी संभावित मेजबानों पर उपलब्ध नहीं होगी।

इसलिए, एक रीड / राइट होस्ट होस्ट को बढ़ाना केवल कमांड -vमें पैरामीटर के साथ संभव है docker run, क्योंकि अन्य उत्तर सही ढंग से इंगित करते हैं।


मेजबान निर्देशिका वास्तव में क्या है?
निकोलस S.Xu

@ निकोलस.एक्सयू वास्तविक डॉकटर होस्ट मशीन पर कोई भी पथ।
जे। स्कॉट एलबलिन

5

यहां विंडोज पथ के साथ एक उदाहरण दिया गया है:

docker run -P -it --name organizr --mount src="/c/Users/MyUserName/AppData/Roaming/DockerConfigs/Organizr",dst=/config,type=bind organizrtools/organizr-v2:latest

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

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

इसे अपने क्लिपबोर्ड पर कॉपी करें:

C:\Users\My PC\AppData\Roaming\DockerConfigs\Organizr

Apps Keyकर्सर को उस स्थान पर दबाएँ जहाँ आप इसे कमांड-लाइन पर चाहते हैं, और यह वहाँ पेस्ट करेगा:

"/c/Users/My PC/AppData/Roaming/DockerConfigs/Organizr"

मेरे लिए बहुत समय बचाता है। यहाँ यह किसी और के लिए है जो इसे उपयोगी पा सकता है।

; --------------------------------------------------------------------------------------------------------------
;
; Docker Utility: Convert a Windows Formatted Path to a Docker Formatter Path
;                   Useful for (example) when mounting Windows volumes via the command-line.
;
; By:       J. Scott Elblein
; Version:  1.0
; Date:     2/5/2019
;
; Usage:    Cut or Copy the Windows formatted path to the clipboard, press the AppsKey on your keyboard
;           (usually right next to the Windows Key), it'll format it into a 'docker path' and enter it
;           into the active window. Easy example usage would be to copy your intended volume path via
;           Explorer, place the cursor after the "-v" in your Docker command, press the Apps Key and
;           then it'll place the formatted path onto the line for you.
;
; TODO::    I may or may not add anything to this depending on needs. Some ideas are:
;           
;           - Add a tray menu with the ability to do some things, like just replace the unformatted path
;               on the clipboard with the formatted one rather than enter it automatically.
;           - Add 'smarter' handling so the it first confirms that the clipboard text is even a path in
;               the first place. (would need to be able to handle Win + Mac + Linux)
;           - Add command-line handling so the script doesn't need to always be in the tray, you could
;               just pass the Windows path to the script, have it format it, then paste and close.
;               Also, could have it just check for a path on the clipboard upon script startup, if found
;               do it's job, then exit the script.
;           - Add an 'all-in-one' action, to copy the selected Windows path, and then output the result.
;           - Whatever else comes to mind.
;
; --------------------------------------------------------------------------------------------------------------

#NoEnv
SendMode Input
SetWorkingDir %A_ScriptDir%

AppsKey::

    ; Create a new var, store the current clipboard contents (should be a Windows path)
    NewStr := Clipboard

    ; Rip out the first 2 chars (should be a drive letter and colon) & convert the letter to lowercase
    ; NOTE: I could probably replace the following 3 lines with a regexreplace, but atm I'm lazy and in a rush.
    tmpVar := SubStr(NewStr, 1, 2)
    StringLower, tmpVar, tmpVar

    ; Replace the uppercase drive letter and colon with the lowercase drive letter and colon
    NewStr := StrReplace(NewStr, SubStr(NewStr, 1, 2), tmpVar)

    ; Replace backslashes with forward slashes
    NewStr := StrReplace(NewStr,  "\", "/")

    ; Replace all colons with nothing
    NewStr := StrReplace(NewStr, ":", "")

    ; Remove the last char if it's a trailing forward slash
    NewStr :=  RegExReplace(NewStr, "/$")

    ; Append a leading forward slash if not already there
    if RegExMatch(NewStr, "^/") == 0
        NewStr :=  "/" . NewStr

    ; If there are any spaces in the path ... wrap in double quotes
    if RegExMatch(NewStr, " ") > 0
        NewStr :=  """" . NewStr . """"

    ; Send the result to the active window
    SendInput % NewStr 

4

विंडोज 10 में यह काम करने के लिए मुझे सिस्टम ट्रे से डॉकर सेटिंग्स विंडो को खोलना और साझा ड्राइव अनुभाग पर जाना था ।

मैंने उसके बाद बॉक्स को चेक किया C। डॉकर ने मेरे उपयोगकर्ता फ़ोल्डर में लिखने के लिए प्राधिकरण प्राप्त करने के लिए मेरे डेस्कटॉप क्रेडेंशियल्स के लिए कहा।

फिर मैंने ऊपर दिए उदाहरणों के साथ डॉकटर कंटेनर चलाया और कंटेनर /dataमें अटैच होने वाले उस सेटिंग पेज पर भी उदाहरण दिया ।

docker run -v c:/Users/<user.name>/Desktop/dockerStorage:/data -other -options

3

ध्यान दें कि विंडोज में आपको पूर्ण पथ प्रदान करना होगा।

नीचे मेरे लिए काम किया।

docker run -t -i -v D:/projects/:/home/chankeypathak/work -p 8888:8888 jupyter/tensorflow-notebook /bin/bash

3

मेरे पास एक ही मुद्दे थे, मैं docker पर C: \ Users \ फ़ोल्डर को माउंट करने की कोशिश कर रहा था,
यह है कि मैंने इसे Docker Toolbox प्रोग्राम लाइन कैसे बनाया

 $ docker run -it --name <containername> -v /c/Users:/myVolData <imagename>

2

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


2

आप एक अलग दृश्य अनुभव के लिए पोर्टेनर वेब एप्लिकेशन के साथ भी ऐसा कर सकते हैं ।

पहले पोर्टेनर छवि को खींचें:

docker pull portainer/portainer

फिर पोर्टेनेर के लिए एक वॉल्यूम बनाएं:

docker volume create portainer_data

पोर्टेनेर कंटेनर भी बनाएं:

docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

आप इस URL पर अपने ब्राउज़र के साथ वेब ऐप का उपयोग कर पाएंगे: " http: // localhost: 9000 "। पहले लॉगिन पर, आपको अपने पोर्टेनेर व्यवस्थापक क्रेडेंशियल्स सेट करने के लिए संकेत दिया जाएगा।

वेब ऐप में, इन मेनू और बटन का पालन करें: (कंटेनर> कंटेनर जोड़ें> सेटिंग भरें > कंटेनर को तैनात करें)

पोर्टेनेर के साथ "माउंट" वॉल्यूम बनाने में मुझे परेशानी हुई और मुझे एहसास हुआ कि मुझे अपने कंटेनर की मात्रा बनाते समय "बाइंड" पर क्लिक करना होगा। नीचे वॉल्यूम बाइंडिंग सेटिंग्स का एक चित्रण है जो मेरे कंटेनर निर्माण के लिए काम करता है जिसमें एक घुड़सवार मात्रा होती है जो मेजबान को बांधती है।

वॉल्यूम बाइंडिंग सेटिंग्स

PS: मैं डॉकर 19.035 और पोर्टेनर 1.23.1 का उपयोग कर रहा हूं

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