डॉकर अनाम वॉल्यूम को नामित वॉल्यूम में बदल देता है

मैंने वॉल्यूम के लिए नाम निर्दिष्ट किए बिना डॉकर कमांड लाइन का उपयोग करके एक डॉकर छवि की कोशिश की है । अब मैंने पाया कि मैं इस कंटेनर/छवि का उपयोग जारी रखना चाहता हूं लेकिन कंटेनर को डॉकर कंपोज़ में परिभाषित करके ।

क्या है सबसे अच्छा अभ्यास अनाम/अनाम संस्करणों से डेटा रखने के लिए और डॉकर कंपोज़ द्वारा बनाए गए नए कंटेनर में उनका उपयोग करें?

  • क्या मैं किसी तरह अनाम को नामित वॉल्यूम में बदल सकता हूं?
  • या क्या मुझे नामित वॉल्यूम के साथ डॉकर कंपोज़ के साथ एक नया कंटेनर बनाना चाहिए और डेटा कॉपी करना चाहिए?
  • या कोई अन्य विकल्प?

संक्षेप में वर्कअराउंड:

docker volume create --name <new_volume>docker run --rm -it -v <old_volume>:/from:ro -v <new_volume>:/to alpine \    ash -c "cd /from ; cp -av . /to"docker volume rm <old_volume>

इस विधि में डॉकर एपीआई का उपयोग करने का लाभ है । यह एक हल्के लिनक्स छवि का उपयोग करता है जिसे कहा जाता है alpine और इसका डिफ़ॉल्ट शेल, ash फ़ाइल कॉपी चलाने के लिए, cp -av पुराने वॉल्यूम से नए नामित वॉल्यूम तक ।

आप वर्तमान में मौजूदा वॉल्यूम का नाम नहीं बदल सकते । (यह सच है कि क्या वे पहले नामित थे या अनाम थे और उनके नाम ऑटो-जेनरेट किए गए थे । )

आप देख सकते हैं यह मुद्दा इस सुविधा के कार्यान्वयन के बारे में अधिक जानकारी के लिए, साथ ही डेवलपर्स को यह बताने के लिए अपना "+1"/"थम्स अप" जोड़ें कि आप इसे चाहते हैं ।

इसके बिना, जहां तक मुझे पता है, ऐसा करने का एकमात्र अच्छा तरीका नया नामित वॉल्यूम बनाना और डेटा कॉपी करना है ।

सिवफैन का जवाब मेरे लिए काम नहीं करता है, इसलिए मैं यहां अपना समाधान पोस्ट कर रहा हूं:

docker run --rm --volumes-from <container_name> -v <new_volume_name>:/to ubuntu bash -c "cd <source_dir>; cp -r . <dest_dir>/."

यह सामग्री की प्रतिलिपि बनाता है source_dir के साथ कंटेनर में container_name में dest_dir नई मात्रा के भीतर new_volume_name.

यह सत्यापित करने के लिए कि यह काम किया, आप की सामग्री सूचीबद्ध कर सकते हैं dest_dir साथ में:

docker run --rm -i -v <new_colume_name>:/tmp ubuntu find /tmp

इस लेखन के समय एकमात्र विकल्प डेटा की प्रतिलिपि बनाना है । विवरण आपके विशेष सेटअप के आधार पर भिन्न हो सकते हैं । किए जाने वाले चरणों की सामान्य सूची इस प्रकार है:

  1. चरण 3 पर नया वॉल्यूम बनाने के लिए स्रोत कंटेनर को रोकें और निकालें ।

    docker stop NAMEdocker rm NAME# ordocker-compose stop SERVICEdocker-compose rm SERVICE

    कुछ मामलों में आप स्रोत कंटेनर को हटाने को स्थगित करने में सक्षम हो सकते हैं, उदाहरण के लिए स्विच करते समय docker-compose अनाम मात्रा के लिए docker-compose नामित मात्रा। इस मामले में up नया वॉल्यूम बनाएगा। और आप डेटा कॉपी करके आगे बढ़ सकते हैं । लेकिन इस मामले में भी कंटेनर को रोकना सलाह दी जाती है कि आप उन्हें कॉपी करते समय डेटा को बदलने से बचें । और आप के लिए स्रोत कंटेनर को दूर करने के लिए मिल गया है docker-compose नए वॉल्यूम पर स्विच करने के लिए (चेतावनियों पर ध्यान दें) ।

    कुछ मामलों में इसकी वास्तव में आवश्यकता नहीं है, उदाहरण के लिए स्टैंडअलोन कंटेनरों से स्विच करते समय docker-compose.

  2. बदलें docker-compose.yml यदि लागू हो ।

  3. नया वॉल्यूम बनाने के लिए नया कंटेनर शुरू करें ।

    स्टैंडअलोन कंटेनर:

    docker run ...# ordocker-compose up -d
  4. डेटा बदलने से बचने के लिए नए कंटेनर को रोकें ।

    docker stop ...# ordocker-compose stop

    एक नामित वॉल्यूम के साथ एक स्टैंडअलोन कंटेनर जैसे माइग्रेट करने के मामले में आप कंटेनर को शुरू करने/रोकने के स्थान पर वॉल्यूम बना सकते हैं ।

  5. डेटा कॉपी करें ।

    docker run --rm -v "SRC_VOLUME:/from" -v "DST_VOLUME:/to" \    bash -c '        shopt -s dotglob        # rm -r /to/*  # e.g. pg might have populated the new volume        cp -r /from/* /to    '

    जहां एसआरसी_वॉल्यूम, डीएसटी_वॉल्यूम-वॉल्यूम नाम, आईडी, या होस्ट पर निर्देशिका के लिए पूर्ण पथ ।

    कंटेनर उपयोग से जुड़े वॉल्यूम को सूचीबद्ध करने के लिए:

    docker inspect CONTAINER --format '{{json .Mounts}}' | jq

    जहां कंटेनर-कंटेनर का नाम या आईडी ।

  6. नया कंटेनर शुरू करें ।

    docker run ...# ordocker-compose up -d
  7. आनन्दित :)

यदि आप विभिन्न सेटअप के साथ प्रयोग करना चाहते हैं, तो निम्नलिखित देखें सार.

मुझे यह नामित वॉल्यूम के बारे में जानकारी की तलाश में मिला । मुझे एहसास है कि यह एक पुरानी पोस्ट है लेकिन इसे पढ़ने के बाद मैंने कुछ शोध किया और पाया कि इस समय कम से कम, यह संभव है फ़ाइल सिस्टम को टैरबॉल के रूप में निर्यात करें, और छवि के लिए या एक छवि के रूप में एक टैरबॉल आयात करें.

पहले अपने कंटेनरों की फाइल सिस्टम को निर्यात करें:

docker container export -o filename CONTAINER

और एक नया कंटेनर बनाने के बाद / अपने फाइल सिस्टम में टैरबॉल आयात करें:

docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]

यदि आप एक संग्रह निर्दिष्ट करते हैं, तो डॉकर इसे / (रूट) के सापेक्ष कंटेनर में खोल देता है ।

आप इस छोटे से बांका के साथ अनटैग्ड इमेज भी बना सकते हैं:

docker import filesystem.tar