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


91

मैं पुराने तरीके से Docker का उपयोग कर रहा था, जिसमें एक वॉल्यूम कंटेनर था:

docker run -d --name jenkins-data jenkins:tag echo "data-only container for Jenkins"

लेकिन अब मैं एक नामांकित वॉल्यूम बनाकर नए तरीके से बदल गया:

 docker volume create --name my-jenkins-volume 

मैंने इस नए वॉल्यूम को एक नए जेनकींस कंटेनर में बांधा। केवल एक चीज जो मैंने छोड़ी है वह एक फ़ोल्डर है जिसमें मेरे पास /var/jenkins_homeमेरे पिछले जेनकींस कंटेनर हैं। (उपयोग करके docker cp) अब मैं उस फ़ोल्डर की सामग्री के साथ अपना नया नाम दिया गया वॉल्यूम भरना चाहता हूं।

क्या मैं उस फ़ोल्डर की सामग्री को कॉपी कर सकता हूं /var/lib/jenkins/volume/my-jenkins-volume/_data?

जवाबों:


141

आप निश्चित रूप से सीधे डेटा को कॉपी कर सकते हैं/var/lib/docker/volumes/my-jenkins-volume/_data , लेकिन ऐसा करने से आप निम्न हैं:

  • डॉक होस्ट की शारीरिक पहुंच पर भरोसा। यदि आप दूरस्थ docker एपीआई के साथ बातचीत कर रहे हैं तो यह तकनीक काम नहीं करेगी।

  • वॉल्यूम कार्यान्वयन के एक विशेष पहलू पर भरोसा करना भविष्य में बदल सकता है, आपके पास उस पर निर्भर किसी भी प्रक्रिया को तोड़ना।

मुझे लगता है कि आप कमांड लाइन क्लाइंट के माध्यम से docker api का उपयोग करके उन चीजों पर भरोसा करना बंद कर सकते हैं जिन्हें आप पूरा कर सकते हैं। सबसे आसान समाधान शायद एक सहायक कंटेनर का उपयोग करना है, कुछ इस तरह है:

docker run -v my-jenkins-volume:/data --name helper busybox true
docker cp . helper:/data
docker rm helper

3
अपनी दूसरी बुलेट के बारे में, आप docker volume inspect my-jenkins-volume --format '{{.Mountpoint}}'इसे प्रोग्रामिक रूप से भौतिक स्थान प्राप्त करने के लिए चला सकते हैं । अभी भी एक महान विचार की तरह महसूस नहीं करता है।
14:24 बजे c24w

9
इस सहायक कंटेनर को वास्तव में चलाने की आवश्यकता नहीं है। बस इसे बनाने के लिए पर्याप्त होगा, फिर इसे चलाएं docker cpऔर फिर इसे हटा दें।
एलेक्स

आप परिणामों को देखने या फ़ाइलों को मैन्युअल रूप से संशोधित करने के लिए उस कंटेनर में निष्पादित नहीं कर सकते।
CodeOrElse 13

3
ध्यान दें कि मैक के लिए डॉकर/var/lib/docker/volumes/my-jenkins-volume/_data का उपयोग करते समय लिस्टिंग काम नहीं करती है क्योंकि फाइल को xhyve वर्चुअल मशीन के अंदर संग्रहीत किया जाता है । मंचों देखें .ocker.com
t/

1
सच यहाँ समझाया गया है stackoverflow.com/questions/29762231/…
ज़ूबी

32

आप किसी एक का उपयोग करके स्वीकृत उत्तर को कम कर सकते हैं, जैसे

docker run --rm -v `pwd`:/src -v my-jenkins-volume:/data busybox cp -r /src /data

1
im सोच रहा था कि / tmp की क्षणिक प्रकृति cp के पूर्ण होने से पहले संभवतः आपके डेटा को हटाने के लिए कंटेनर का खतरा पैदा कर सकती है? pathname.com/fhs/pub/fhs-2.3.html#TMPTEMPORARYFILES
thurt

1
लिंक वास्तव में / tmp में फाइलों के जीवनकाल को स्पष्ट नहीं करता है। मैं बताता हूं: "प्रोग्राम को यह नहीं मानना ​​चाहिए कि प्रोग्राम के इनवोकेशन के बीच किसी भी फाइल या डायरेक्टरी / tmp को संरक्षित किया गया है।" जिसका अर्थ है कि फाइलें बच जाएंगी, लेकिन यह एक गारंटी है। Docker के लिए -v विकल्प कंटेनर में एक निर्देशिका बनाएगा यदि वह मौजूद नहीं है, तो इस संभावित दौड़ की स्थिति के बारे में चिंतित होने पर / tmp / src to / src पर काम करना बदल जाएगा। मैं इसे प्रतिबिंबित करने के लिए उत्तर को संपादित करूंगा, क्योंकि कोई नकारात्मक पहलू नहीं है।
हेडबॅब

3
इसका -v `pwd`:/srcमतलब यह नहीं है कि कमांड होस्ट पर चल रहा है? ( pwdउदाहरण के लिए, यदि यह एक अलग मशीन है, तो होस्ट का नक्शा कैसे हो सकता है ? - यह नहीं हो सकता है।) यदि होस्ट पर काम करने वाला कमांड काम नहीं कर रहा है। मेरा मानना ​​है कि इसीलिए हमारे पास docker cp है। ऐसा लगता है कि यह डॉकटर के लिए "रास्ता" नहीं है - यह सिर्फ एक विशेष मामला है जो केवल तभी काम करता है जब होस्ट पर docker कमांड चल रही हो। क्या मैंने ठीक समझा?
व्येक

हां, मुझे लगता है कि तुम सही हो। pwdहोस्ट मशीन पर फ़ाइल को हल करना चाहिए। डॉकर्स माउंट डॉक्यूमेंटेशन से: "बाइंड माउंट्स के मामले में, पहला फ़ील्ड होस्ट मशीन पर फ़ाइल या निर्देशिका का पथ है।"
हेडबैंड

1
इसलिए, यह आपकी स्थानीय फ़ाइलों को कंटेनर में कॉपी करने के लिए काम नहीं करता है यदि दूरस्थ होस्ट में, जैसा कि आप बढ़ते हैं pwdजो दूरस्थ होस्ट में मौजूद होने की आवश्यकता नहीं है। Dmytro Melnychuk (create + cp + rm) के समाधान के बजाय स्थानीय लोगों को कंटेनर में कॉपी करें चाहे वह कहीं भी चल रहा हो।
ज़ावी मोंटेरो

27

आपको पहले से मौजूद नाम मात्रा में डेटा जोड़ने के लिए कुछ कंटेनर शुरू करने की आवश्यकता नहीं है, बस एक कंटेनर बनाएं और वहां डेटा कॉपी करें:

docker container create --name temp -v my-jenkins-volume:/data busybox
docker cp . temp:/data
docker rm temp

2
बशर्ते कि बिजीबॉक्स की सामग्री वास्तव में जरूरत नहीं है; आप यह कर सकते हैं hello-worldऔर यह भी काम करता है। busybox1.22 एमबी है। इसके बजाय hello-world13.3kB है। सवाल यह है कि जिस तरह हम स्क्रैच से डॉकरीफाइल कर सकते हैं, उसी तरह क्या हम "डॉकटर कंटेनर क्रिएट" भी कर सकते हैं "इमेज" के रूप में क्योंकि हम केवल वॉल्यूम को "माउंट" करना चाहते हैं और कभी भी कंटेनर को शुरू नहीं करते हैं?
ज़ावि मोंटेरो

1
+1 ने इस समाधान के लिए शीर्ष पर मतदान किया लेकिन इसके लिए सही सिंटैक्स docker cpहैdocker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
मार्को डफल

4

यहाँ ~ / data to docker मात्रा की सामग्री की नकल करने के लिए चरण हैं, जिसका नाम my-vol है

चरण 1. एक "अस्थायी" कंटेनर में वॉल्यूम संलग्न करें। टर्मिनल में चलाने के लिए यह कमांड:

docker run --rm -it --name alpine --mount type=volume,source=my-vol,target=/data alpine

चरण 2. मेरी-वॉल्यूम में ~ / डेटा की कॉपी सामग्री । इसके लिए इस आदेश को नई टर्मिनल विंडो में चलाएं:

cd ~/data docker cp . alpine:/data

यह ~ / डेटा की सामग्री को मेरी-वॉल्यूम मात्रा में कॉपी करेगा । कॉपी के बाद अस्थायी कंटेनर से बाहर निकलें।

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