होस्ट से डॉकर कंटेनर में फाइल कॉपी करना


1573

मैं डॉकटर कंटेनरों के लिए एक बैकअप और पुनर्स्थापना समाधान बनाने की कोशिश कर रहा हूं जिसके साथ हम काम करते हैं।

मेरे पास Docker आधार छवि है जो मैंने बनाई है, ubuntu:baseऔर यह नहीं चाहता कि हर बार इसे Docker फ़ाइल के साथ इसमें फ़ाइलों को जोड़ने के लिए इसका पुनर्निर्माण किया जाए।

मैं एक स्क्रिप्ट बनाना चाहता हूं जो होस्ट मशीन से चलती है और ubuntu:baseडॉकटर छवि का उपयोग करके एक नया कंटेनर बनाती है और फिर उस कंटेनर में फाइलों को कॉपी करती है।

मैं होस्ट से कंटेनर में फ़ाइलों की प्रतिलिपि कैसे बना सकता हूं?


11
यदि आप पुनर्निर्माण नहीं करना चाहते हैं, तो " डॉकटर कमिट " क्यों नहीं ? जो आपकी छवि को बचाता है।
बेरेंड डी बोअर

26
एक धारणा पर किसी ने भी टिप्पणी नहीं की है: सामान्य तौर पर, कंटेनरों को "पंचांग" के रूप में माना जाता है। चल रहे कंटेनर (परीक्षण, प्रोटोटाइप) से फ़ाइलों को कॉपी करने के मामलों का उपयोग किया जाता है। लेकिन अगर आप खुद को ऐसी स्थिति में पाते हैं, जहां आप डॉकफाइल्स और / या कंपोज़ का उपयोग करने के लिए जरूरी चीजों का पुनर्निर्माण नहीं कर सकते हैं, तो आप बुरी जगह पर हो सकते हैं। आप आमतौर पर कंटेनरों का बैकअप नहीं लेना चाहते हैं जैसे कि वे ओएस या वीएम ऑब्जेक्ट थे। आम तौर पर बोल रहा हूं :-)
स्कॉट प्रिव

जवाबों:


2668

cpआदेश फ़ाइलों की प्रतिलिपि करने के लिए इस्तेमाल किया जा सकता है।

एक विशिष्ट फ़ाइल को कंटेनर में कॉपी किया जा सकता है जैसे:

docker cp foo.txt mycontainer:/foo.txt

एक विशिष्ट फ़ाइल को कंटेनर से कॉपी किया जा सकता है जैसे:

docker cp mycontainer:/foo.txt foo.txt

जोर देने के लिए, mycontainerएक कंटेनर आईडी है, न कि एक छवि आईडी।

फ़ोल्डर द्वारा निहित कई फाइलों का उपयोग करके फ़ोल्डर srcमें कॉपी किया जा सकता है target:

docker cp src/. mycontainer:/target
docker cp mycontainer:/src/. target

संदर्भ: डॉकर सीएलआई डॉक्स के लिएcp

1.8 से पहले के डॉकर संस्करणों में, केवल एक कंटेनर से होस्ट में फ़ाइलों को कॉपी करना संभव था। मेजबान से कंटेनर तक नहीं।


2
यह भी ध्यान दें कि यह मेजबान vm या मुख्य OS पर हो सकता है और या तो कंटेनर या vm को होस्ट करने के लिए होस्ट (या मुख्य ओएस) पर काम करता है
एडम तुलिपर - MSFT

7
Dockerfile में आप बिल्ड समय के दौरान फ़ाइलों को जोड़ने के लिए ADD कीवर्ड का उपयोग कर सकते हैं।
0x7d7b


10
docker cpकंटेनर से होस्ट की प्रतिलिपि बनाने के लिए उपयोग अच्छा काम करता है, लेकिन जब होस्ट से कंटेनर में फ़ाइलों की प्रतिलिपि बनाने के लिए इसका उपयोग करते हैं, तो कोई प्रभाव नहीं ... किसी को भी पता है क्यों? डॉक वर्जन: डॉकर संस्करण 1.10.3, बिल्ड cb079f6-असमर्थित
Ace.Yin

2
क्या मैं होस्ट से कंटेनर तक docker cp का उपयोग करके कई फ़ाइलों की प्रतिलिपि बना सकता हूं?
योगेश

182
  1. कंटेनर का नाम या छोटा कंटेनर आईडी प्राप्त करें:

    $ docker ps
    
  2. पूर्ण कंटेनर आईडी प्राप्त करें:

    $ docker inspect -f   '{{.Id}}'  SHORT_CONTAINER_ID-or-CONTAINER_NAME
    
  3. प्रतिलिपि फ़ाइल:

    $ sudo cp path-file-host /var/lib/docker/aufs/mnt/FULL_CONTAINER_ID/PATH-NEW-FILE
    

उदाहरण:

$ docker ps

CONTAINER ID      IMAGE    COMMAND       CREATED      STATUS       PORTS        NAMES

d8e703d7e303   solidleon/ssh:latest      /usr/sbin/sshd -D                      cranky_pare

$ docker inspect -f   '{{.Id}}' cranky_pare

या

$ docker inspect -f   '{{.Id}}' d8e703d7e303

d8e703d7e3039a6df6d01bd7fb58d1882e592a85059eb16c4b83cf91847f88e5

$ sudo cp file.txt /var/lib/docker/aufs/mnt/**d8e703d7e3039a6df6d01bd7fb58d1882e592a85059eb16c4b83cf91847f88e5**/root/file.txt

13
मेरे लिए मेज़बान के बढ़ते रास्ते में नहीं aufsबल्कि एक था devicemapper। कंटेनर बढ़ते मार्ग (जबकि यह चल रहा है) की जांच करने के लिए सबसे आसान तरीका है कमांड चलाना mount
डेरेनियो

3
मैंने उपरोक्त समाधान की कोशिश की। इसने फाइल को डॉक विशिष्ट निर्देशिका में कॉपी किया। हालाँकि, जब मैं डॉक कंटेनर के लिए बैश का उपयोग करता हूं, तो फाइलें वहां दिखाई नहीं देती हैं। क्या मैं कुछ छोड़ रहा हूं ?
AppleBud

2
नया रास्ता है / var / lib / docker / devicemapper / mnt / << id >> / rootfs /
mcuadros

4
मेरे लिए, डॉकर 1.4.1 (वर्तमान नवीनतम) पर, यह है/var/lib/docker/aufs/diff/<id>/
user193130

3
गरीब MacOS उपयोगकर्ताओं के लिए क्या है? माउंट डायरेक्टरी /var/libमेरे लिए है। find / -name dockerसहायक भी नहीं था।
प्रयागपाद

141

कंटेनर को शुरू करते समय कंटेनर पर एक मेजबान निर्देशिका को माउंट करने का सबसे साफ तरीका है:

{host} docker run -v /path/to/hostdir:/mnt --name my_container my_image
{host} docker exec -it my_container bash
{container} cp /mnt/sourcefile /path/to/destfile

3
आप कंटेनर कैसे चला सकते हैं? मुझे लगा कि आप केवल एक छवि के साथ ऐसा कर सकते हैं।
पावेल जैतसेव

मैं यह काम नहीं कर सकता जब कंटेनर मौजूदा aka पहले चला है। नीचे तार अच्छा काम करता है।
Eino Mäkitalo

1
मेरे लिए यह काम करने का एकमात्र तरीका छवि को चलाने (कंटेनर को इंस्टेंट करना) के साथ वॉल्यूम संलग्न करना था। के साथ समाप्त हुआ:docker run -d -p -v /host/path:/mnt --name container_name image_name
पीटर एन

2
यह मेरे लिए काम नहीं करता है। कम से कम एक कंटेनर नहीं चल सकता। केवल छवि चला सकते हैं
शशांक हेगड़े

1
मैं हैरान हूँ कि docker cpयह एक तरह से ऑपरेशन है!
थोरसुमोनर

115

निम्नलिखित इसे करने का काफी बदसूरत तरीका है लेकिन यह काम करता है।

docker run -i ubuntu /bin/bash -c 'cat > file' < file

7
यह महान काम करता है! लेकिन परिवर्तन करने के लिए मत भूलना docker commit `docker ps -l -q` ubuntu-with-file:। बदलाव खो जाएगा (का उपयोग करें जो आप के बजाय जो भी नाम चाहते हैं ubuntu-with-file)
माइकल_शर्फ

@ एरिक: कंटेनर के चलने पर फ़ाइल कहाँ स्थित है?
१२:०२ पर कुन्नोर

49
Adition में, हम नए प्रयोग कर सकते हैं docker execचल रहा है कंटेनर के साथ काम करने के लिए सुविधा:docker exec -it <container_id> bash -c 'cat > /path/to/container/file' < /path/to/host/file/
Mikl

17
@ मैक्कल मुझे लगता है कि इसके docker exec -i ...बजाय होना चाहिए -it, क्योंकि फ़ाइल से पाइपिंग करते समय कोई TTY नहीं है।
z0r

4
यदि आप अभी भी डॉकर के पुराने संस्करण पर अटके हुए हैं (जैसा कि मैं हूं) और एक पूरी निर्देशिका की प्रतिलिपि बनाना चाहता हूं, तो आप ऐसा कर सकते हैं: tar -c -v -f - /path/to/host/directory | docker exec -i <container-name> bash -c 'tar -x -v --strip-components 1 -f - -C /path/to/container/directory'
eahanson

43

यदि आपको एक रनिंग कंटेनर पर ऐसा करने की आवश्यकता है तो आप docker exec (1.3 में जोड़ा गया) का उपयोग कर सकते हैं।

सबसे पहले, कंटेनर का नाम या आईडी खोजें:

$ docker ps
CONTAINER ID        IMAGE                        COMMAND             CREATED             STATUS              PORTS                   NAMES
b9b7400ddd8f        ubuntu:latest                "/bin/bash"         2 seconds ago       Up 2 seconds                                elated_hodgkin

ऊपर के उदाहरण में हम या तो उपयोग कर सकते हैं b9b7400ddd8fया elated_hodgkin

यदि आप कंटेनर में /tmp/somefilesहोस्ट पर सब कुछ कॉपी करना चाहते हैं /var/www:

$ cd /tmp/somefiles
$ tar -cv * | docker exec -i elated_hodgkin tar x -C /var/www

हम /bin/bashकंटेनर में निष्पादित कर सकते हैं और सत्यापित कर सकते हैं कि यह काम कर रहा है:

$ docker exec -it elated_hodgkin /bin/bash
root@b9b7400ddd8f:/# ls /var/www
file1  file2

Centos 7.4 पर अभिनव डॉट कॉम पर महान काम करता है।
डूडी बॉय

41
  1. एक नया डॉकफाइल बनाएं और अपने आधार के रूप में मौजूदा छवि का उपयोग करें।

    FROM myName/myImage:latest
    
    ADD myFile.py bin/myFile.py
    
  2. फिर कंटेनर का निर्माण करें:

    docker build .
    

2
इसी से मेरा काम बना है। और कुछ नहीं। धन्यवाद!
ओवेन

यह एक नई छवि बनाएगा, न कि सीधे नए कंटेनर से। यदि आपने myFile.py के रूप में परिवर्तित होने पर इस छवि का पुन: उपयोग किया है, तो यह फ़ाइल के पुराने संस्करण का उपयोग करेगा, जब तक कि आप छवि का पुनर्निर्माण नहीं करते।
गुइलियम लेब्रेटन

मुझे यह सबसे तेज़ तरीका लगता है यदि आप किसी दूरस्थ सर्वर पर परीक्षण कर रहे हैं।
डोमिनिक क्रुलक

के अनुसार इस ज्यादातर लोगों बल्कि जोड़ें की तुलना में प्रति का उपयोग करना चाहिए। लेकिन स्थानीय फ़ाइलों के लिए (जैसा कि इस उदाहरण में) वे समकक्ष हैं।
hoosierEE

39

समाधान नीचे दिया गया है,

डॉकर शेल से,

root@123abc:/root#  <-- get the container ID

यजमान से

cp thefile.txt /var/lib/docker/devicemapper/mnt/123abc<bunch-o-hex>/rootfs/root

फ़ाइल को सीधे उस स्थान पर कॉपी किया जाएगा जहाँ कंटेनर फ़ाइल सिस्टम पर बैठता है।


10
बहुत बढ़िया जवाब। नए डॉकटर रिलीज में पथ का नाम बदलकर / var / lib / docker / aufs / mnt / कर दिया गया है
एलेक्स वोलकोव

devicemapper पथ docker 1.6 के साथ फेडोरा पर काम नहीं करता है। इसे एक अलग क्यू के रूप में रखा है, stackoverflow.com/questions/29939419/… , किसी भी टिप्पणी की सराहना की जाएगी।
योगेश_D

33

आमतौर पर तीन प्रकार होते हैं:

  1. एक कंटेनर से मेजबान तक

    docker cp container_id:./bar/foo.txt .
    

dev1

  1. मेजबान से एक कंटेनर तक

    docker exec -i container_id sh -c 'cat > ./bar/foo.txt' < ./foo.txt
    

dev2

  1. एक कंटेनर से एक कंटेनर में 1 और 2 का मिश्रण होता है

    docker cp container_id1:./bar/foo.txt .
    
    docker exec -i container_id2 sh -c 'cat > ./bar/foo.txt' < ./foo.txt
    

dev3


6
docker cp दोनों तरह से काम करता है। निष्पादित करने के लिए कोई ज़रूरत नहीं है, बिल्ली, और पुनर्निर्देशित। docker cp host_file.txt कंटेनर: / path /
tbm

32

चल रहे कंटेनर में फ़ाइलों की प्रतिलिपि बनाने के लिए एक और समाधान टार का उपयोग कर रहा है:

tar -c foo.sh | docker exec -i theDockerContainer /bin/tar -C /tmp -x

कंटेनर foo.shमें फ़ाइल की प्रतिलिपि बनाता है /tmp

संपादित करें: Reduntant निकालें -f, Maarten की टिप्पणी के लिए धन्यवाद ।


यह अच्छा है अगर आपको पूरी निर्देशिका भेजने की आवश्यकता है। एकल फ़ाइल के लिए, एरिक का उत्तर सरल है।
केल्विन

1
@ केल्विन: लेकिन टार फ़ाइल विशेषताओं और नाम को भी संरक्षित करता है। दूसरों के बीच में इसका मतलब है कि आपको केवल एक बार नाम लिखना होगा (और वहां आपको अपने शेल से टैब पूरा करना होगा)। तो मैं कहूंगा कि टार वास्तव में सरल है, जब तक कि यह कंटेनर में स्थापित है।
मार्टन

1
-f -हालांकि, डिफ़ॉल्ट व्यवहार वैसे भी stdout करने के लिए लिखने के लिए एक सा अनावश्यक है।
मार्टन

इस का अर्थ है कि राल पर एक मेजबान निर्भरता है
cellige

आप सही हैं - आपको मेजबान पर और कंटेनर के भीतर टार स्थापित करने की आवश्यकता है। आजकल docker cp का उपयोग करना बेहतर उपाय है।
जोमैट

24

होस्ट से रनिंग कंटेनर में एक फाइल कॉपी करने के लिए

docker exec -i $CONTAINER /bin/bash -c "cat > $CONTAINER_PATH" < $HOST_PATH

एरिक के जवाब और मिकल और z0r की टिप्पणियों के आधार पर ।


स्वीकृत समाधान कभी-कभी फ़ाइलों के इंडेंटेशन को परेशान करते हैं जब चल रहे कंटेनरों में स्थानांतरित होते हैं। यह ऐसे मामलों के लिए बिल्कुल सही काम करता है
ड्रीम्स

15

डॉकर 1.8 के साथ, docker cpहोस्ट से कंटेनर में फ़ाइलों को कॉपी करने में सक्षम है। डॉकर ब्लॉग पोस्ट देखें डॉकटर 1.8 की घोषणा: सामग्री ट्रस्ट, टूलबॉक्स, और रजिस्ट्री और आर्केस्ट्रा के लिए अपडेट


यहाँ एक उदाहरण हैdocker cp foo.txt mycontainer:/foo.txt
लॉकवोब

15

यह शीर्षक में इस प्रश्न में उठाए गए प्रश्न 'मेजबान से डॉकटर कंटेनर में फाइल कॉपी करना' का सीधा जवाब है।

कोशिश करो docker cp। यह ऐसा करने का सबसे आसान तरीका है और मेरे मैक पर भी काम करता है। उपयोग:

docker cp /root/some-file.txt some-docker-container:/root

यह some-file.txtनिर्देशिका में फ़ाइल /rootको आपके होस्ट मशीन पर some-docker-containerनिर्देशिका में नामित डॉकटर कंटेनर में कॉपी कर देगा /root। यह सिक्योर कॉपी सिंटैक्स के बहुत करीब है। और जैसा कि पिछले पोस्ट में दिखाया गया है, आप इसका उल्टा इस्तेमाल कर सकते हैं। यानी, आप कंटेनर से होस्ट में भी फाइल कॉपी करते हैं।

और इस पोस्ट को डाउनलिंक करने से पहले, कृपया दर्ज करें docker cp --help। प्रलेखन पढ़ना बहुत सहायक हो सकता है, कभी-कभी ...

यदि आपको वह तरीका पसंद नहीं है और आप अपने पहले से निर्मित और चल रहे कंटेनर में डेटा वॉल्यूम चाहते हैं, तो आज मनोरंजन ही आपका एकमात्र विकल्प है। यह भी देखें कि मैं मौजूदा डॉकटर कंटेनर में वॉल्यूम कैसे जोड़ सकता हूं?


15

मैंने यहाँ (उत्कीर्ण) समाधानों में से अधिकांश की कोशिश की, लेकिन docker 17.09 (2018 में) अब / var / lib / docker / aufs फ़ोल्डर नहीं है।

इस सरल docker cpने इस कार्य को हल कर दिया।

docker cp c:\path\to\local\file container_name:/path/to/target/dir/

कंटेनर_नाम कैसे प्राप्त करें?

 docker ps 

एक NAMESसेक्शन है। एक का उपयोग न करें IMAGE


12

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

docker cp {SOURCE_FILE} {DESTINATION_CONTAINER_ID}:/{DESTINATION_PATH}

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

docker cp /home/foo container-id:/home/dir

प्रतियोगी आईडी प्राप्त करने के लिए, दिए गए कमांड को टाइप करें:

docker ps

उपरोक्त सामग्री docker.com से ली गई है ।


8

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

# cat /path/to/host/file/ | docker exec -i -t <container_id> bash -c "/bin/cat > /path/to/container/file"

साझा निर्देशिका का उपयोग करके फ़ाइलें साझा करने के लिए, दिए गए कमांड को टाइप करके कंटेनर चलाएं:

# docker run -v /path/to/host/dir:/path/to/container/dir ...

नोट: अनुमतियों के साथ समस्याएँ उत्पन्न हो सकती हैं क्योंकि कंटेनर के उपयोगकर्ता होस्ट के उपयोगकर्ताओं के समान नहीं हैं।


1
इसके अलावा:docker exec -it <container_id> bash -c 'cat > /path/to/container/file' < /path/to/host/file/
मिकेल

2
ध्यान दें कि catएक बार बाहर निकलने के बाद इसे समाप्त नहीं किया जाएगा। अगर यह आपके लिए मायने रखता है (यदि आप बैश स्क्रिप्ट कॉपी कर रहे हैं, तो बैश उन्हें चलाने से मना कर देगा), आपको lsof | grep yourfilenameउस catप्रक्रिया को चलाना चाहिए और उस फाइल को मारना चाहिए ।
जॉन्डोडो

धन्यवाद! महान टिप। क्या आप मुझे बता सकते हैं कि इस प्रक्रिया को एक कमांड से कैसे मारें? कुछ इस तरह kill $(lsof | grep /path/to/file | sed ...)। मैं आपकी मदद के लिए आभारी रहूंगा
मीकल

kill $(docker top CONTAINERNAME | sed -n '/cat$/p' | sed 's/^root[^0-9]\+\([0-9]\+\).*$/\1/')
मिकाल

8

यह डॉकर से होस्ट तक डेटा कॉपी करने का कमांड है:

docker cp container_id:file path/filename /hostpath

docker cp a13fb9c9e674:/tmp/dgController.log /tmp/

नीचे होस्ट से डॉकटर तक डेटा कॉपी करने की आज्ञा है:

docker cp a.txt ccfbeb35116b:/home/

7

Docker परिवेश में, सभी कंटेनर निर्देशिका में पाए जाते हैं:

/var/lib/docker/aufs/required-docker-id/

स्रोत निर्देशिका / फ़ाइल को कंटेनर के किसी भाग में कॉपी करने के लिए, दिए गए कमांड को टाइप करें:

sudo cp -r mydir/ /var/lib/docker/aufs/mnt/required-docker-id/mnt/


5

tarऔर docker cpएक निर्देशिका में सब कुछ कॉपी करने के लिए एक अच्छा कॉम्बो है।

एक डेटा वॉल्यूम कंटेनर बनाएँ

docker create --name dvc --volume /path/on/container cirros

निर्देशिका पदानुक्रम को संरक्षित करने के लिए

tar -c -C /path/on/local/machine . | docker cp - dvc:/path/on/container

अपने काम की जांच करें

docker run --rm --volumes-from dvc cirros ls -al /path/on/container

5

यदि होस्ट CentOS या फेडोरा है, तो एक प्रॉक्सी नहीं है /var/lib/docker/aufs, लेकिन यह /procनिम्न है:

cp -r /home/user/mydata/* /proc/$(docker inspect --format "{{.State.Pid}}" <containerid>)/root

यह cmd dataनिर्देशिका की सभी सामग्रियों को /id "कंटेनड" के साथ कंटेनर में कॉपी करेगा ।


यह रेडहैट के लिए अद्वितीय नहीं है: यह डेबियन पर भी काम करता है। (शायद सभी Gnu / Linux के साथ /proc)। फ़ाइल को रूट ही नहीं, बल्कि कहीं और लगाने के लिए पथ का विस्तार करें।
ctrl-alt-delor

5

मामले में यह मेरे जैसे किसी के लिए स्पष्ट नहीं है कि mycontainer@ h3nrik उत्तर में क्या मतलब है, यह वास्तव में कंटेनर आईडी है। एक आउट डॉकटर कंटेनर से एक फ़ाइल को वर्तमान फ़ोल्डर WarpSquare.mp4में कॉपी करने के लिए /app/example_scenes/1440p60मैंने इसका उपयोग किया।

docker cp `docker ps -q -l`:/app/example_scenes/1440p60/WarpSquare.mp4 .

जहां docker ps -q -lअंतिम निकास उदाहरण के कंटेनर आईडी को खींचता है। मामले में यह एक निकास कंटेनर नहीं है जिसे आप इसे प्राप्त कर सकते हैं docker container lsयाdocker ps


1
आप के साथ docker ps -aया बाहर निकल कंटेनरों की आईडी सूचीबद्ध कर सकते हैं docker container ls -a
0x7d7b

4

इस प्रश्न को खोजने वाले कई लोगों को वास्तव में डॉकटर छवि में फ़ाइलों को कॉपी करने की समस्या हो सकती है जबकि इसे बनाया जा रहा है (मैंने किया था)।

उस स्थिति में, आप उस COPYकमांड का उपयोग कर सकते हैं Dockerfileजिसमें आप छवि बनाने के लिए उपयोग करते हैं।

दस्तावेज देखें


4

आप बस अपने स्थानीय मशीन का उपयोग करके आईपी पते का पता लगा सकते हैं

ifconfig

फिर बस अपने डॉकर कंटेनर में प्रवेश करें और टाइप करें

scp user_name@ip_address:/path_to_the_file destination

किसी भी स्थिति में यदि आपके पास SSH क्लाइंट और सर्वर स्थापित नहीं है, तो इसका उपयोग करके इसे स्थापित करें:

sudo apt-get install openssh-server

थैंक्स बहुत, इसने मेरे लिए अच्छा काम किया। साथ ही, मैंने इसे अन्य तरीकों की तुलना में अधिक कुशल पाया
user1314742

सुरक्षा के लिहाज से यह एक भयानक समाधान है।

4

यह एक टॉमकैट कंटेनर को चलाने के दौरान एक एकल फ़ाइल की प्रतिलिपि बनाने के लिए एक ऑनलाइनर है।

docker run -v /PATH_TO_WAR/sample.war:/usr/local/tomcat/webapps/myapp.war -it -p 8080:8080 tomcat

यह युद्ध फ़ाइल को वेब निर्देशिका में कॉपी करेगा और कुछ ही समय में आपके ऐप को चालू कर देगा।


1
-v माउंट करेगा (यानी एक लिंक बनाएँ), कॉपी नहीं
विटालि उलंटिकोव

परिणाम में अंतर यह है कि बढ़ते पिछले कंटेनर सामग्री को छुपाता है, उदाहरण के लिए यदि आप एक कंटेनर फ़ोल्डर पर एक होस्ट फ़ोल्डर माउंट करते हैं तो आप पिछले कंटेनर फ़ोल्डर की सामग्री को नहीं देख सकते हैं
mrq

4

कंटेनर सिंटैक्स:

 docker run -v /HOST/folder:/Container/floder 

Docker File में

COPY hom* /myFolder/        # adds all files starting with "hom"
COPY hom?.txt /myFolder/    # ? is replaced with any single character, e.g., "home.txt"

3

मेरे द्वारा पाए गए कंटेनर में फ़ाइलों की प्रतिलिपि बनाने का सबसे अच्छा तरीका है -vकि docker run कमांड के विकल्प का उपयोग करके होस्ट पर एक निर्देशिका बढ़ रही है ।


3

अच्छे उत्तर हैं, लेकिन बहुत विशिष्ट हैं। मुझे पता है docker psकि कंटेनर आईडी प्राप्त करने का एक अच्छा तरीका है जिसमें आप रुचि रखते हैं

mount | grep <id>

यह देखने के लिए कि वॉल्यूम कहां माउंट किया गया है। यही कारण है कि के

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

मेरे लिए, लेकिन यह OS और कॉन्फ़िगरेशन के आधार पर एक अलग पथ हो सकता है। अब बस उस पथ पर फ़ाइलों की प्रतिलिपि बनाएँ।

प्रयोग करना -vहमेशा व्यावहारिक नहीं होता है।


3

मैंने अभी VLC को संकलित करने के लिए docker का उपयोग करना शुरू किया, यहाँ आप कंटेनर से फाइलों को आगे और पीछे कॉपी करने के लिए क्या कर सकते हैं:

su -
cd /var/lib/docker
ls -palR > /home/user/dockerfilelist.txt

उस txt में एक परिचित फ़ाइल की खोज करें और आपके पास फ़ोल्डर, सीडी के रूप में रूट और वॉयला होगा! आप जो चाहें कॉपी करें।

इसमें "मर्ज" के साथ एक रास्ता हो सकता है, मुझे लगता है कि आप इसमें "अंतर" के साथ चाहते हैं।

इसके अलावा अगर आप कंटेनर से बाहर निकलते हैं और वापस जाना चाहते हैं, जहां आपने छोड़ा था:

docker ps -a
docker start -i containerid

मुझे लगता है कि जब आप एक कमांड के साथ कुछ भी नाम नहीं दिया तो यह उपयोगी है

docker run -it registry.videolan.org:5000/vlc-debian-win64 /bin/bash

हैकर विधि ज़रूर लेकिन क्या!


3
docker cp SRC_PATH CONTAINER_ID:DEST_PATH

उदाहरण के लिए, मैं अपनी फ़ाइल xxxx / download / jenkins को tomcat में कॉपी करना चाहता हूं

मैं कंटेनर टॉम्केट की आईडी प्राप्त करना शुरू करता हूं

docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
63686740b488        tomcat              "catalina.sh run"   12 seconds ago      Up 11 seconds       0.0.0.0:8080->8080/tcp   peaceful_babbage

docker cp xxxx/download/jenkins.war  63686740b488:usr/local/tomcat/webapps/

2

मेरी पसंदीदा विधि:

खेल: धारक:

CONTAINER_ID=$(docker ps | grep <string> | awk '{ print $1 }' | xargs docker inspect -f '{{.Id}}')

file.txt

mv -f file.txt /var/lib/docker/devicemapper/mnt/$CONTAINER_ID/rootfs/root/file.txt

या

mv -f file.txt /var/lib/docker/aufs/mnt/$CONTAINER_ID/rootfs/root/file.txt

devicemapper पथ docker 1.6 के साथ फेडोरा पर काम नहीं करता है। इसे एक अलग क्यू के रूप में रखा है, stackoverflow.com/questions/29939419/… , किसी भी टिप्पणी की सराहना की जाएगी।
योगेश_D

2

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


ऐसा लगता है कि सुरक्षा जोखिम और पहुँच दुःस्वप्न होने की प्रतीक्षा कर रहा है। आप अपनी छवि के भीतर गिट रिपॉजिटरी तक कैसे पहुँच प्रदान करते हैं? यहां तक ​​कि यह मानते हुए कि यह एक सार्वजनिक रिपॉजिटरी है जिसे आप मानते हैं कि आपका कंटेनर जिस होस्ट पर चलता है, उस रेपो तक पहुंच है।
tbm

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