मैं मौजूदा डॉकटर कंटेनर में वॉल्यूम कैसे जोड़ सकता हूं?


297

मेरे पास एक डॉकटर कंटेनर है जिसे मैंने केवल उबंटू पर डोकर स्थापित करके बनाया है:

sudo docker run -i -t ubuntu /bin/bash

मैंने तुरंत जावा और कुछ अन्य उपकरण स्थापित करना शुरू कर दिया, इसके साथ कुछ समय बिताया और कंटेनर को रोक दिया

exit

फिर मैंने एक वॉल्यूम जोड़ना चाहा और महसूस किया कि यह उतना सीधा नहीं है जितना मैंने सोचा था कि यह होगा। यदि मैं उपयोग करता हूं sudo docker -v /somedir run ...तो मैं एक नए नए कंटेनर के साथ समाप्त होता हूं, इसलिए मैंने जावा स्थापित किया है और वही किया है जो मैंने पहले से ही एक घुड़सवार वॉल्यूम के साथ कंटेनर पर पहुंचने के लिए किया है।

होस्ट से एक फ़ोल्डर को माउंट करने के बारे में सभी प्रलेखन का मतलब है कि एक वॉल्यूम बढ़ते हुए कुछ ऐसा है जो कंटेनर बनाते समय किया जा सकता है। तो एकमात्र विकल्प मुझे खरोंच से एक नए कंटेनर को पुन: कॉन्फ़िगर करने से बचना है, मौजूदा कंटेनर को भंडार के लिए प्रतिबद्ध करना और वॉल्यूम बढ़ते समय एक नए के आधार के रूप में उपयोग करना है।

क्या यह वास्तव में मौजूदा कंटेनर में वॉल्यूम जोड़ने का एकमात्र तरीका है?


1
कंटेनरों के बाद, ये प्रोग्रामर्स का एक अभिन्न हिस्सा बन गए और इसलिए इस तरह के प्रश्न यहाँ अधिक बार पोस्ट किए जा रहे हैं। dockerटैग का उपयोग करते हुए यहां पोस्ट किए गए प्रश्न 34k + हैं , जो उन दो साइटों की तुलना में अधिक हैं जो stackoverflow.com/questions/tagged/docker
MA हुसैन टोनू

जवाबों:


394

आप अपने मौजूदा कंटेनर (जो कंटेनर के परिवर्तनों से एक नई छवि बना सकते हैं) बना सकते हैं और फिर इसे अपने नए माउंट के साथ चला सकते हैं।

उदाहरण:

$ docker ps  -a
CONTAINER ID        IMAGE                 COMMAND                  CREATED              STATUS                          PORTS               NAMES
    5a8f89adeead        ubuntu:14.04          "/bin/bash"              About a minute ago   Exited (0) About a minute ago                       agitated_newton

$ docker commit 5a8f89adeead newimagename

$ docker run -ti -v "$PWD/dir1":/dir1 -v "$PWD/dir2":/dir2 newimagename /bin/bash

यदि यह सब ठीक है, तो अपने पुराने कंटेनर को बंद कर दें, और इस नए का उपयोग करें।

बस :)


22
और अगर आपको किसी कारण से पुराने नाम लेने के लिए नए कंटेनर की आवश्यकता है, तो पुराने को हटाने के बाद docker का नाम बदलें
डिर्क

10
केवल यह इंगित करना चाहता था कि ऊपर जहां आप उल्लेख करते हैं newnameofcontainerकि यह संभवतः नाम होना चाहिए new_image_name- क्योंकि आपके सिस्टम पर docker commitएक नई छवि बनाता है। फिर निम्नलिखित में जब आप करते हैं तो docker runआप वास्तव में उस छवि के नाम का उपयोग करते हैं जिसे आप एक नया कंटेनर चलाना चाहते हैं। ऊपर काम करता है, लेकिन सिर्फ दूसरों के लिए स्पष्ट करना चाहता था कि ऊपर दिए गए प्लेसहोल्डर newnameofcontainer वास्तव में एक नई छवि का नाम है। धन्यवाद! जबरदस्त जवाब। ओह, आप पहले docker image ls
डॉकटर

3
वास्तव में, आपको एक नए कंटेनर की आवश्यकता नहीं है यदि आप एक छवि से शुरू करना चाहते हैं। बस docker run -v /srv/a:/tmp ubuntu:14.04अच्छा है।
योंगाहो हू

मेरे पास पहले से ही सभी फाइलों के साथ एक कंटेनर चल रहा है। यदि उपरोक्त विधि नए कंटेनर बनाती है, तो मैं एक बार फिर से सब कुछ नहीं बना सकता हूं। क्या कोई ऐसा तरीका है जिससे मैं इससे बच सकता हूं और नया कंटेनर या छवि बनाए बिना माउंट कर सकता हूं?
दिहिनर

क्या यह पुराने कंटेनर से पुराने वॉल्यूम मैपिंग को बनाए रखेगा या मुझे नए कंटेनर के साथ उन्हें फिर से घोषित करना चाहिए?
Thebeancounter

79

हमारे पास रनिंग कंटेनर में वॉल्यूम जोड़ने का कोई तरीका नहीं है, लेकिन इस उद्देश्य को प्राप्त करने के लिए आप नीचे दिए गए कमांड का उपयोग कर सकते हैं:

एक कंटेनर और स्थानीय फाइल सिस्टम के बीच फ़ाइलों / फ़ोल्डरों को कॉपी करें: -

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-

docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

संदर्भ के लिए देखें:

https://docs.docker.com/engine/reference/commandline/cp/


47
कंटेनर से वॉल्यूम बढ़ाने और फ़ाइलों की प्रतिलिपि बनाने के बीच बहुत बड़ा अंतर है ...
जूल्स

31
वैसे भी इससे मुझे मदद मिली। मैं 'docker cp' कमांड को नहीं जानता था, और इसको कॉपी करने की कोशिश कर रहा था - मेज़बान कंटेनर को होस्ट करने के लिए।
इवान

3
यह एक माउंट नहीं है, लेकिन यह कंटेनर और स्थानीय होस्ट के बीच फाइलों को वापस लाने और फैंकने के लिए आसान है।
लाइनह्र

हालांकि यह स्थानीय रूप से कंटेनर सामग्री की नकल करने की समस्या को हल करता है, लेकिन यह बढ़ते वॉल्यूम के बराबर होने के करीब नहीं है और इसे विकल्प के रूप में नहीं सोचा जाना चाहिए। अर्थात्, प्रतिकृति को उपयोगकर्ता द्वारा प्रबंधित किया जाना है, और डेटा अब दो स्थानों पर मौजूद है।
सेबेस्टियन गावड़े

1
मुझे समझ नहीं आता कि इतने वोट क्यों हैं, यह पूछे गए सवाल का बहुत गलत जवाब है।
जोओ माटोस

33

मैंने /home/<user-name>अपने होस्ट के /mntफ़ोल्डर को मौजूदा (चालू नहीं) कंटेनर के फ़ोल्डर में सफलतापूर्वक माउंट किया है । आप इसे निम्नलिखित तरीके से कर सकते हैं:

  1. बंद कंटेनर के लिए खुली कॉन्फ़िगरेशन फ़ाइल, जो कि /var/lib/docker/containers/99d...1fb/config.v2.json( config.jsondocker के पुराने संस्करणों के लिए हो सकती है ) मिल सकती है।

  2. MountPointsअनुभाग ढूंढें , जो मेरे मामले में खाली था "MountPoints":{}:। आगे सामग्री को इस तरह से बदलें (आप उचित सेटिंग्स के साथ दूसरे कंटेनर से उचित सामग्री की प्रतिलिपि बना सकते हैं):

"MountPoints":{"/mnt":{"Source":"/home/<user-name>","Destination":"/mnt","RW":true,"Name":"","Driver":"","Type":"bind","Propagation":"rprivate","Spec":{"Type":"bind","Source":"/home/<user-name>","Target":"/mnt"},"SkipMountpointCreation":false}}

या समान (स्वरूपित):

  "MountPoints": {
    "/mnt": {
      "Source": "/home/<user-name>",
      "Destination": "/mnt",
      "RW": true,
      "Name": "",
      "Driver": "",
      "Type": "bind",
      "Propagation": "rprivate",
      "Spec": {
        "Type": "bind",
        "Source": "/home/<user-name>",
        "Target": "/mnt"
      },
      "SkipMountpointCreation": false
    }
  }
  1. Docker सेवा को पुनरारंभ करें: service docker restart

यह मेरे लिए Ubuntu 18.04.1 और Docker 18.09.0 के साथ काम करता है


3
जवाब के लिए धन्यवाद। चरण 3 महत्वपूर्ण है। मैं यह भी जोड़ूंगा कि लिखने से पहले डॉकटर कंटेनर को रोकना बेहतर है।
बजीपी

7
यह सबसे अच्छा जवाब है क्योंकि यह मौजूदा कंटेनर को पूरी तरह से संरक्षित करता है। मैंने यही किया है: 1. डॉक इंजन को बंद systemctl stop docker.serviceकरें config.v2.json: 2. संपादित करें : vim <(jq . /var/lib/docker/containers/<container-ID>/config.v2.json)3. एक फ़ाइल में अपडेट सहेजें: :w config.v2.json4. बाहर निकलें::q! 5. मौजूदा फ़ाइल को अपडेट jq -c . config.v2.json > /var/lib/docker/containers/<container-ID>/config.v2.jsonकरें : 6. डॉक इंजन systemctl start docker.serviceशुरू करें : 7. यदि आवश्यक हो तो कंटेनर शुरू करें : docker start <container-name/ID>8. आनंद लें :-)
Android नियंत्रण

2
एक महत्वपूर्ण कदम है service docker restart। मैंने कोशिश की docker restart <container>तो नया कॉन्फिगर नहीं उठाया गया है, और यह पुराने कॉन्फिगर द्वारा अधिलेखित हो रहा है।
KFL

1
साथ jqही JSON को प्रिंट करने में बहुत मदद मिलेगी ताकि यह मानव संपादन योग्य हो:cat config.v2.json | jq . > config.json
KFL

14

Jérôme Petazzoni में एक बहुत ही रोचक ब्लॉग पोस्ट है कि कैसे एक कंटेनर में एक वॉल्यूम संलग्न करें जबकि यह चल रहा है । यह कुछ ऐसा नहीं है जो डॉकर बॉक्स से बाहर बनाया गया हो, लेकिन इसे पूरा करना संभव है।

जैसा कि वह भी बताते हैं

यह फाइलसिस्टम पर काम नहीं करेगा जो ब्लॉक डिवाइस पर आधारित नहीं है।

यह तभी काम करेगा जब / proc / mounts सही ढंग से ब्लॉक डिवाइस नोड को सूचीबद्ध करता है (जो, जैसा कि हमने ऊपर देखा, जरूरी नहीं कि यह सच हो)।

इसके अलावा, मैंने केवल अपने स्थानीय परिवेश पर इसका परीक्षण किया; मैं भी एक बादल उदाहरण या ऐसा कुछ पर कोशिश नहीं की

YMMV


8

दुर्भाग्यवश वॉल्यूम माउंट करने का स्विच विकल्प केवल runकमांड में पाया जाता है ।

docker run --help

-v, --volume list Bind mount a volume (default [])

एक ऐसा तरीका है जिससे आप इसके आसपास काम कर सकते हैं, हालांकि आपको उन अनुप्रयोगों को फिर से स्थापित नहीं करना पड़ेगा जिन्हें आपने पहले ही अपने कंटेनर में स्थापित कर लिया है।

  1. अपने कंटेनर का निर्यात करें docker container export -o ./myimage.docker mycontainer
  2. छवि के रूप में आयात करें docker import ./myimage.docker myimage
  3. फिर docker run -i -t -v /somedir --name mycontainer myimage /bin/bash

1
FYI करें - docker container१.११.२ पर एक वैध आदेश नहीं है (जो कि नवीनतम संस्करण है जो इस लेखन के रूप में Synology द्वारा समर्थित है)। मुझे यह कहते हुए कोई डॉक्स नहीं मिलेंगे कि इसे कब जोड़ा गया। इस मामले में पहला कमांड है docker export -o ./myimage.docker mycontainer
क्रिस आर

2

लंबे समय तक इस समस्या को देखने के बाद मुझे डॉकटर विंडोज कंटेनर का उपयोग करने के लिए एक नोट!

Condiditions:

  • विंडोज 10
  • डॉकर डेस्कटॉप (नवीनतम संस्करण)
  • छवि Microsoft / mssql-server-windows-developer के लिए डॉक विंडोज कंटेनर का उपयोग करना

मुसीबत:

  • मैं अपने विंडोज़ कंटेनर में एक होस्ट शब्दकोश को माउंट करना चाहता था।

आंशिक रूप से अस्वीकृत के रूप में समाधान:

  • डॉकटर कंटेनर बनाएं

docker run -d -p 1433:1433 -e sa_password=<STRONG_PASSWORD> -e ACCEPT_EULA=Y microsoft/mssql-server-windows-developer

  • कंटेनर में कमांड शेल पर जाएं

docker exec -it <CONTAINERID> cmd.exe

  • डीआईआर बनाएं

mkdir DirForMount

  • कंटेनर बंद करो

docker container stop <CONTAINERID>

  • प्रतिबद्ध कंटेनर

docker commit <CONTAINERID> <NEWIMAGENAME>

  • पुराने कंटेनर को हटा दें

docker container rm <CONTAINERID>

  • नई छवि और वॉल्यूम बढ़ते के साथ नए कंटेनर बनाएं

docker run -d -p 1433:1433 -e sa_password=<STRONG_PASSWORD> -e ACCEPT_EULA=Y -v C:\DirToMount:C:\DirForMount <NEWIMAGENAME>

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


-3

सबसे अच्छा तरीका है कि आपके स्थानीय फ़ाइल सिस्टम पर निर्देशिका के अंदर सभी फ़ाइलों और फ़ोल्डरों को कॉपी करें: docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH

SRC_PATHकंटेनर DEST_PATHपर है लोकलहोस्ट

फिर docker-compose downउसी के साथ एक वॉल्यूम संलग्न करें DEST_PATHऔर डॉक कंटेनर का उपयोग करके चलाएंdocker-compose up -d

निम्नलिखित में वॉल्यूम जोड़ें docker-compose.yml

volumes:
 - DEST_PATH:SRC_PATH

ऊपर अन्य, बेहतर विकल्प हैं।
श्रीमती

वास्तव में, ऊपर बेहतर विकल्प हैं, और चारों ओर फ़ाइलों की प्रतिलिपि उन्हें माउंट नहीं कर रही है। इसके अलावा, डॉकटर-कम्पोज़ विकल्प के लिए दी गई "वॉल्यूम" परिभाषा अन्य तरह से है: वॉल्यूम: - HOST_PATH: CONTAINER_PATH
Guillaume S.
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.