अद्यतन 2016-03-02 : डॉकर 1.9.0 के रूप में, डॉकर ने उन संस्करणों का नाम दिया है जो डेटा-केवल कंटेनरों को प्रतिस्थापित करते हैं । नीचे दिए गए उत्तर, साथ ही साथ मेरे लिंक किए गए ब्लॉग पोस्ट में, अभी भी इस मायने में मूल्य है कि डॉकटर के अंदर डेटा के बारे में कैसे विचार करें लेकिन डेटा कंटेनरों के बजाय नीचे वर्णित पैटर्न को लागू करने के लिए नामित संस्करणों का उपयोग करने पर विचार करें।
मेरा मानना है कि इसे हल करने के लिए विहित तरीका डेटा-केवल कंटेनरों का उपयोग करके है । इस दृष्टिकोण के साथ, वॉल्यूम डेटा तक सभी एक्सेस कंटेनर के माध्यम से होते हैं -volumes-from
जो डेटा कंटेनर का उपयोग करते हैं, इसलिए होस्ट यूआईडी / जीआईडी कोई फर्क नहीं पड़ता।
उदाहरण के लिए, दस्तावेज़ में दिया गया एक उपयोग मामला डेटा वॉल्यूम का बैकअप ले रहा है। ऐसा करने के लिए एक अन्य कंटेनर का उपयोग बैकअप के माध्यम से करने के लिए किया जाता है tar
, और इसका उपयोग -volumes-from
वॉल्यूम को माउंट करने के लिए भी किया जाता है। इसलिए मुझे लगता है कि ग्रॉक का मुख्य बिंदु यह है: उचित अनुमतियों के साथ होस्ट पर डेटा तक पहुंच कैसे प्राप्त करें, इसके बारे में सोचने के बजाय, यह सोचें कि आपको क्या करना है - बैकअप, ब्राउज़िंग, आदि - एक अन्य कंटेनर के माध्यम से । कंटेनरों को स्वयं लगातार यूआईडी / ग्रिड का उपयोग करने की आवश्यकता होती है, लेकिन उन्हें मेजबान पर कुछ भी मैप करने की आवश्यकता नहीं होती है, जिससे पोर्टेबल शेष रहता है।
यह मेरे लिए भी अपेक्षाकृत नया है, लेकिन यदि आपके पास कोई विशेष उपयोग मामला है तो टिप्पणी करने के लिए स्वतंत्र महसूस करें और मैं उत्तर पर विस्तार करने का प्रयास करूंगा।
अद्यतन : टिप्पणियों में दिए गए उपयोग के मामले के लिए, आपके पास some/graphite
ग्रेफाइट चलाने के लिए एक छवि some/graphitedata
और डेटा कंटेनर के रूप में एक छवि हो सकती है । इसलिए, बंदरगाहों और इस तरह की अनदेखी, Dockerfile
छवि some/graphitedata
की तरह कुछ है:
FROM debian:jessie
# add our user and group first to make sure their IDs get assigned consistently, regardless of other deps added later
RUN groupadd -r graphite \
&& useradd -r -g graphite graphite
RUN mkdir -p /data/graphite \
&& chown -R graphite:graphite /data/graphite
VOLUME /data/graphite
USER graphite
CMD ["echo", "Data container for graphite"]
डेटा कंटेनर बनाएँ और बनाएँ:
docker build -t some/graphitedata Dockerfile
docker run --name graphitedata some/graphitedata
some/graphite
Dockerfile भी एक ही uid / GIDs मिलना चाहिए, इसलिए यह कुछ इस तरह दिख सकता है:
FROM debian:jessie
# add our user and group first to make sure their IDs get assigned consistently, regardless of other deps added later
RUN groupadd -r graphite \
&& useradd -r -g graphite graphite
# ... graphite installation ...
VOLUME /data/graphite
USER graphite
CMD ["/bin/graphite"]
और इसे निम्नानुसार चलाया जाएगा:
docker run --volumes-from=graphitedata some/graphite
ठीक है, अब जो हमें सही उपयोगकर्ता / समूह के साथ हमारे ग्रेफाइट कंटेनर और संबंधित डेटा-केवल कंटेनर प्रदान करता है (ध्यान दें कि आप some/graphite
कंटेनर को डेटा कंटेनर के लिए फिर से उपयोग कर सकते हैं , इसे चलाते समय एंट्रोपो / सेमी को ओवरराइड कर सकते हैं, लेकिन उन्हें होने के रूप में अलग-अलग चित्र IMO स्पष्ट है)।
अब, आप डेटा फ़ोल्डर में कुछ संपादित करना चाहते हैं। इसलिए होस्ट को वॉल्यूम बढ़ाने और इसे संपादित करने के बजाय, उस काम को करने के लिए एक नया कंटेनर बनाएं। इसे कहते हैं some/graphitetools
। some/graphite
छवि की तरह ही उपयुक्त उपयोगकर्ता / समूह भी तैयार करें ।
FROM debian:jessie
# add our user and group first to make sure their IDs get assigned consistently, regardless of other deps added later
RUN groupadd -r graphite \
&& useradd -r -g graphite graphite
VOLUME /data/graphite
USER graphite
CMD ["/bin/bash"]
आप इस DRY को डॉकरीफाइल से विरासत में प्राप्त some/graphite
कर some/graphitedata
सकते हैं, या एक नई छवि बनाने के बजाय मौजूदा लोगों में से एक का पुनः उपयोग कर सकते हैं (आवश्यक के रूप में प्रविष्टि / सेमी को ओवरराइड कर सकते हैं)।
अब, आप बस चलाते हैं:
docker run -ti --rm --volumes-from=graphitedata some/graphitetools
और फिर vi /data/graphite/whatever.txt
। यह पूरी तरह से काम करता है क्योंकि सभी कंटेनरों में एक ही ग्रेफाइट उपयोगकर्ता होता है जिसका मिलान uid / gid होता है।
चूंकि आप कभी /data/graphite
होस्ट से माउंट नहीं होते हैं , आप परवाह नहीं करते हैं कि होस्ट यूआईडी / जीआईडी मैप्स को यूआईडी / जीआईडी के अंदर graphite
और graphitetools
कंटेनरों के अंदर कैसे परिभाषित करता है । उन कंटेनरों को अब किसी भी मेजबान को तैनात किया जा सकता है, और वे पूरी तरह से काम करना जारी रखेंगे।
इस के बारे में साफ बात यह है कि graphitetools
उपयोगी उपयोगिताओं और लिपियों के सभी प्रकार हो सकते हैं, कि आप अब पोर्टेबल तरीके से भी तैनात कर सकते हैं।
UPDATE 2 : इस उत्तर को लिखने के बाद, मैंने इस दृष्टिकोण के बारे में अधिक संपूर्ण ब्लॉग पोस्ट लिखने का निर्णय लिया । मुझे उम्मीद है यह मदद करेगा।
अद्यतन 3 : मैंने इस उत्तर को सही किया और अधिक बारीकियों को जोड़ा। इसमें पहले स्वामित्व और परमिट के बारे में कुछ गलत धारणाएं शामिल थीं - स्वामित्व आमतौर पर वॉल्यूम निर्माण के समय यानी डेटा कंटेनर में असाइन किया जाता है, क्योंकि जब वॉल्यूम बनाया जाता है। इस ब्लॉग को देखें । यह एक आवश्यकता नहीं है, हालांकि - आप डेटा कंटेनर को "संदर्भ / संभाल" के रूप में उपयोग कर सकते हैं और एक एंट्रीपॉइंट में चाउन के माध्यम से दूसरे कंटेनर में स्वामित्व / परमिट सेट कर सकते हैं, जो सही उपयोगकर्ता के रूप में कमांड को चलाने के लिए गोसु के साथ समाप्त होता है। अगर किसी को इस दृष्टिकोण में दिलचस्पी है, तो कृपया टिप्पणी करें और मैं इस दृष्टिकोण का उपयोग करके एक नमूने के लिंक प्रदान कर सकता हूं।