डॉकर - मैं इमेज से होस्ट में फाइल कॉपी कैसे कर सकता हूं?


117

मेरा प्रश्न कंटेनरों से मेजबानों तक फ़ाइलों की प्रतिलिपि बनाने पर इस प्रश्न से संबंधित है ; मेरे पास एक डॉकरफाइल है जो निर्भरताएं प्राप्त करता है, स्रोत से एक निर्माण कलाकृतियों को संकलित करता है, और एक निष्पादन योग्य चलाता है। मैं बिल्ड विरूपण साक्ष्य को कॉपी करना चाहता हूं (मेरे मामले में यह '../ लक्ष्य / ` .zipद्वारा निर्मित है sbt dist, लेकिन मुझे लगता है कि यह प्रश्न जार, बायनेरिज़ आदि पर भी लागू होता है।

docker cpकंटेनरों पर काम करता है, छवियों पर नहीं; क्या मुझे एक फ़ाइल शुरू करने के लिए एक कंटेनर शुरू करने की आवश्यकता है? एक स्क्रिप्ट में, मैंने /bin/bashबैकग्राउंड में इंटरेक्टिव मोड में चलने की कोशिश की , फ़ाइल को कॉपी किया, और फिर कंटेनर को मार दिया, लेकिन यह हास्यास्पद लगता है। क्या कोई बेहतर तरीका है?

दूसरी ओर, मैं एक खोल से बचने के लिए चाहते हैं .tarचलाने के बाद फ़ाइल docker save $IMAGENAMEसिर्फ एक फ़ाइल बाहर निकलने के लिए (लेकिन यह है कि, सबसे सरल की तरह लगता है सबसे धीमी है, विकल्प अभी)।

मैं docker संस्करणों का उपयोग करूँगा, उदाहरण के लिए:

docker run -v hostdir:out $IMAGENAME /bin/cp/../blah.zip /out

लेकिन मैं boot2dockerOSX में चल रहा हूं और मैं नहीं जानता कि सीधे अपने मैक होस्ट फाइलसिस्टम को कैसे लिखा जाए (रीड-राइट वॉल्यूम मेरे बूट 2 डॉक वीएम के अंदर बढ़ रहा है, जिसका मतलब है कि मैं आसानी blah.zipसे एक छवि से निकालने के लिए स्क्रिप्ट साझा नहीं कर सकता हूं अन्य। विचार।

जवाबों:


172

किसी छवि से किसी फ़ाइल को कॉपी करने के लिए, एक अस्थायी कंटेनर बनाएं, फ़ाइल को उससे कॉपी करें और फिर उसे हटा दें:

id=$(docker create image-name)
docker cp $id:path - > local-tar-file
docker rm -v $id

create
Docker के

2
@ThorSummoner docker createको docker 1.3, blog.docker.com/2014/10/…
इगोर बुकानोव

1
मुझे नहीं पता कि इसे सही उत्तर के रूप में क्यों नहीं चुना गया है।
CentAu

1
निश्चित रूप से सही जवाब !!! कंटेनर के अंदर कुछ भी भरोसा नहीं करता है ... गोलंग खरोंच छवियों के लिए, यह एकमात्र तरीका संभव है!
मार्सेलो डे सेल्स

2
किसी कारण के लिए प्रतिलिपि stdout करने के लिए और फिर इसे एक स्थानीय फ़ाइल में निर्देशित करें? जब मैंने ऐसा किया, तो उसने फ़ाइल की सामग्री से पहले और बाद में नियंत्रण वर्णों का एक गुच्छा डंप किया। इसे सीधे चलाने के रूप में docker cp $id:path > local-tar-fileपूरी तरह से काम किया।
योनातन

62

दुर्भाग्य से वहाँ सीधे डॉकर छवियों से फ़ाइलों को कॉपी करने के लिए एक तरीका नहीं लगता है। आपको पहले एक कंटेनर बनाने की आवश्यकता है और फिर कंटेनर से फ़ाइल को कॉपी करें।

हालाँकि, यदि आपकी छवि में एक catकमांड है (और यह कई मामलों में काम करेगा), तो आप इसे एक ही कमांड से कर सकते हैं:

docker run --rm --entrypoint cat yourimage  /path/to/file > path/to/destination

यदि आपकी छवि शामिल नहीं है cat, तो बस एक कंटेनर बनाएं और docker cpकमांड का उपयोग करें जैसा कि इगोर के जवाब में सुझाया गया है।


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

23

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

docker run -v $PWD:/opt/mount --rm --entrypoint cp image:version /data/libraries.tgz /opt/mount/libraries.tgz

असली 0m0.446s

** वीएस **

docker run --rm --entrypoint cat image:version /data/libraries.tgz > libraries.tgz

असली 0m9.014s


यह संभवतः अंतर्निहित फ़ाइल सिस्टम के साथ पहले उदाहरण में फ़ाइल की एक आलसी / उथली कॉपी (थिंक कॉपी-ऑन-राइट) का प्रदर्शन करने के लिए अधिक है, वास्तव में फ़ाइल के बाइट्स को दूसरे उदाहरण में कॉपी करना है। एक उपयोगी परीक्षा यह देखने के लिए होगी कि क्या cat a >bबनाम cp a bसमान समय है जैसा कि यहां दिखाया गया है। इसके अलावा, यदि स्रोत पथ और गंतव्य पथ अलग-अलग फ़ाइल सिस्टम पर रहते हैं, तो दोनों उदाहरण पूर्ण बाइट-फॉर-बाइट कॉपी की ओर ले जाएंगे।
केविनऑर

14

माता-पिता की टिप्पणी ने पहले ही दिखाया कि बिल्ली का उपयोग कैसे किया जाए । आप भी इसी तरह से टार का उपयोग कर सकते हैं :

docker run yourimage tar -c -C /my/directory subfolder | tar x

1
यह उत्तर फाइलों के बजाय निर्देशिकाओं की नकल करना है क्योंकि मूल प्रश्न के बारे में पूछता है। हालाँकि, +1 क्योंकि यह फाइलों के साथ भी काम करता है और एक अतिरिक्त सुविधा के साथ आता है: अनुमति और मालिक संरक्षण। महान!
कैलिगारी

5
वास्तव में, मैं उपयोग करता हूंdocker run --rm --entrypoint tar _image_ cC _img_directory_ . | tar xvC _host_directory_
कैलिगारी

6
docker cp $(docker create registry.example.com/ansible-base:latest):/home/ansible/.ssh/id_rsa ./hacked_ssh_key

एक लाइन समाधान की आपूर्ति करना चाहता था

संपादित करें: कंटेनर को इस घोल में चलाना भी नहीं आता है


1

इस समस्या का एक और (संक्षिप्त) उत्तर:

docker run -v $PWD:/opt/mount --rm -ti image:version bash -c "cp /source/file /opt/mount/"

0

मैं macOS पर boot2docker का उपयोग कर रहा हूं। मैं आपको आश्वस्त कर सकता हूं कि "docker cp" पर आधारित स्क्रिप्ट पोर्टेबल हैं। क्योंकि किसी भी कमांड को बूट 2 डॉक के अंदर रिले किया जाता है लेकिन फिर बाइनरी स्ट्रीम को आपके मैक पर चलने वाले डॉक कमांड लाइन क्लाइंट पर वापस भेज दिया जाता है। इसलिए docker क्लाइंट से ऑपरेशन को सर्वर के अंदर निष्पादित किया जाता है और निष्पादित क्लाइंट उदाहरण पर वापस लिखा जाता है!

मैं किसी भी docker कंटेनर के साथ docker संस्करणों के लिए एक बैकअप स्क्रिप्ट साझा कर रहा हूं और मेरी बैकअप लिपियों को lin2 और macOS दोनों पर boot2docker के साथ परीक्षण किया गया है। प्लेटफार्मों के बीच बैकअप का आसानी से आदान-प्रदान किया जा सकता है। मूल रूप से मैं अपनी स्क्रिप्ट के अंदर निम्नलिखित कमांड निष्पादित कर रहा हूं:

docker run --name=bckp_for_volume --rm --volumes-from jenkins_jenkins_1 -v /Users/github/jenkins/backups:/backup busybox tar cf /backup/JenkinsBackup-2015-07-09-14-26-15.tar /jenkins

एक नया बिजीबॉक्स कंटेनर चलाता है और jenkins_jenkins_1 नाम के साथ मेरे जेनकींस कंटेनर की मात्रा को मापता है। पूरी मात्रा फ़ाइल बैकअप / JenkinsBackup-2015-07-09-14-26-15.tar को लिखी जाती है

मैंने पहले से ही लिनक्स कंटेनर और मेरे मैक कंटेनर के बीच बैकअप या स्क्रिप्ट को पुनर्स्थापित करने के लिए बिना किसी समायोजन के स्थानांतरित कर दिया है। यदि आप यही चाहते हैं कि आप पूरी स्क्रिप्ट को यहां एक ट्यूटोरियल देखें: blacklabelops / jenkins


0

आप होस्ट पर एक स्थानीय पथ को कंटेनर पर पथ पर बाँध सकते हैं , और फिर cpअपनी स्क्रिप्ट के अंत में उस पथ पर वांछित फ़ाइल (ओं) को रख सकते हैं

$ docker run -d \
  -it \
  --name devtest \
  --mount type=bind,source="$(pwd)"/target,target=/app \
  nginx:latest

फिर बाद में कॉपी करने की जरूरत नहीं है।

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