यह डॉकर कंटेनरों का उपयोग करने में एक तकनीकी समस्या के बारे में है जो डॉकर होस्ट कंप्यूटर के साथ इंटरैक्ट करता है, जो आम तौर पर कंटेनर के अंदर होस्ट फाइल सिस्टम का उपयोग करने से संबंधित है।
ऐसा विशेष रूप से प्रतिलिपि प्रस्तुत करने योग्य अनुसंधान संदर्भ में होता है।
मैंने एक ओपनसोर्स उपयोगिता विकसित की है जो उस समस्या से निपटने में मदद करती है।
डॉकर कंटेनर का प्रारंभिक और मुख्य उपयोग का मामला: एक स्वयं निहित एप्लिकेशन जो केवल कुछ नेटवर्क पोर्ट के साथ होस्ट सिस्टम के साथ इंटरैक्ट करता है।
एक वेब एप्लिकेशन के बारे में सोचें: डॉकर कंटेनर में आमतौर पर एक वेब सर्वर और एक वेब एप्लिकेशन होता है, उदाहरण के लिए पोर्ट 80 (कंटेनर के अंदर) पर चल रहा है। फिर कंटेनर को होस्ट पर चलाया जाता है, कंटेनर के आंतरिक पोर्ट 80 को होस्ट पोर्ट (जैसे 8000) से बाइंड करके।
फिर कंटेनरीकृत ऐप और होस्ट सिस्टम के बीच एकमात्र इंटरैक्शन इस बाध्य नेटवर्क पोर्ट के माध्यम से होता है।
निष्पादन वातावरण के रूप में कंटेनर पूरी तरह से अलग हैं:
लेकिन, उन निष्पादन परिवेशों का उपयोग करने के लिए, उन कंटेनरों के पास होस्ट सिस्टम तक पहुंच होनी चाहिए, विशेष रूप से होस्ट उपयोगकर्ता फ़ाइल सिस्टम तक।
मान लीजिए आपने एक आईडीई को कंटेनरीकृत किया है, उदाहरण के लिए। रुस्टूडियो.
आपका Rstudio डॉकर कंटेनर के अंदर स्थापित और चल रहा है, लेकिन इसे आपके प्रोजेक्ट फ़ोल्डर में फ़ाइलों को पढ़ने और संपादित करने की आवश्यकता है।
इसके लिए आप docker run --volume विकल्प का उपयोग करके अपने प्रोजेक्ट फ़ोल्डर (अपने होस्ट फ़ाइल सिस्टम में) को बाइंड माउंट करें।
तब आपकी फ़ाइलें डॉकर कंटेनर से पहुंच योग्य होती हैं।
अब चुनौती फ़ाइल अनुमतियाँ हैं। मान लीजिए कि आपके होस्ट उपयोगकर्ता के पास यूजरआईडी 1001 है, और मान लीजिए कि कंटेनर में रुडियो प्रक्रिया का मालिक उपयोगकर्ता या तो 0 (रूट), या 1002 है।
]यदि कंटेनर उपयोगकर्ता root है, तो उसे आपकी फ़ाइलों को पढ़ने में कोई समस्या नहीं होगी।
लेकिन जैसे ही आप कुछ मौजूदा फ़ाइलों को संपादित करते हैं, नई बनाते हैं (उदाहरण के लिए पीडीएफ, एचटीएमएल), ये फ़ाइलें रूट होस्ट फ़ाइल सिस्टम पर भी होंगी!।
मतलब कि आपका स्थानीय होस्ट उपयोगकर्ता उनका उपयोग नहीं कर पाएगा, या उन्हें हटा नहीं पाएगा, क्योंकि वे रूट से संबंधित हैं।
अब यदि कंटेनर उपयोगकर्ता आईडी 1002 है, तो रुस्टूडियो आपकी फ़ाइलों को पढ़ने, उन्हें संपादित करने या नई फ़ाइलें बनाने में सक्षम नहीं हो सकता है।
यदि ऐसा हो भी सकता है, तो कुछ बहुत ही अनुमेय अनुमतियों की सेटिंग के द्वारा, आपका स्थानीय होस्ट उपयोगकर्ता उनका उपयोग करने में सक्षम नहीं हो सकता है।
निश्चित रूप से उस समस्या को हल करने का एक क्रूर तरीका होस्ट कंप्यूटर पर रूट के साथ और डॉकर कंटेनर के साथ चलना है। यह हमेशा संभव नहीं है और कुछ स्पष्ट गंभीर सुरक्षा चिंताओं को जन्म देता है।
क्योंकि हम पहले से नहीं जान सकते कि होस्ट उपयोगकर्ता आईडी क्या होगी (यहां 1001), हम पूर्व-कॉन्फ़िगर नहीं कर सकते हैं
डॉकर कंटेनर उपयोगकर्ता की उपयोगकर्ता आईडी।
docker run अब एक --user विकल्प प्रदान करता है जो कुछ आपूर्ति की गई उपयोगकर्ता आईडी के साथ एक छद्म उपयोगकर्ता बनाने में सक्षम बनाता है
चलने के समय पर। उदाहरण के लिए, docker run --user 1001 ... प्रक्रियाओं के साथ चलने वाला एक docker कंटेनर बनाएगा
उपयोगकर्ता आईडी 1001 वाले उपयोगकर्ता से संबंधित।
तो हम अभी भी इस मुद्दे पर क्या चर्चा कर रहे हैं? क्या यह हल नहीं हुआ?
यहां गतिशील रूप से बनाए गए उपयोगकर्ता के बारे में कुछ विचित्रताएं हैं:
हम इन समस्याओं से निपट सकते हैं, लेकिन यह थकाऊ और निराशाजनक हो सकता है।
हम वास्तव में जो चाहते हैं, वह है डॉकर कंटेनर उपयोगकर्ता को पूर्व-कॉन्फ़िगर करना, और उसके उपयोगकर्ता आईडी को रनटाइम पर गतिशील रूप से बदलने में सक्षम होना...
docker_userid_fixer एक ओपन सोर्स उपयोगिता है जिसका उपयोग मेरे द्वारा अभी उठाए गए उपयोगकर्ता आईडी मुद्दे को ठीक करने के लिए docker एंट्रीपॉइंट के रूप में किया जाना है।
आइए देखें कि इसका उपयोग कैसे करें: आप इसे अपने डॉकर ENTRYPOINT के रूप में सेट करते हैं, यह निर्दिष्ट करते हुए कि किस उपयोगकर्ता का उपयोग किया जाना चाहिए और उसका उपयोगकर्ता आईडी गतिशील रूप से संशोधित किया गया है:
ENTRYPOINT ["/usr/local/bin/docker_userid_fixer","user1"]
आइए अपनी शर्तों में सटीक रहें:
फिर, कंटेनर रनटाइम निर्माण पर, दो विकल्प हैं:
तो व्यवहार में यह हमारी समस्या का समाधान करता है:
आप यहां सेटअप के बारे में निर्देश पा सकते हैं।
लेकिन इसका मतलब यह है:
छोटे निष्पादन योग्य (17k) का निर्माण या डाउनलोड करें
इसे अपनी डॉकर छवि में कॉपी करें
इसे सेतुइड रूट के रूप में निष्पादन योग्य बनाएं
इसे अपने प्रवेश बिंदु के रूप में कॉन्फ़िगर करें
मैंने कुछ संक्षिप्त नोट्स डाले हैं https://github.com/kforner/docker_userid_fixer#how-it-works
लेकिन मैं दोबारा लिखने की कोशिश करूंगा।
कार्यान्वयन का सार कंटेनर में निष्पादन योग्य docker_userid_fixer का setuid रूट है।
उपयोगकर्ता आईडी बदलने के लिए हमें रूट अनुमतियों की आवश्यकता है, और यह सेतुआईडी केवल
के लिए उस विशेषाधिकार प्राप्त निष्पादन को सक्षम बनाता है।
docker_userid_fixerprogram, और वह बहुत ही कम समय के लिए।
जरूरत पड़ने पर जैसे ही उपयोगकर्ता आईडी को संशोधित किया जाएगा, docker_userid_fixer मुख्य प्रक्रिया को स्विच कर देगा
अनुरोधित उपयोगकर्ता को (और उपयोगकर्ता आईडी!)।
यदि आप इन विषयों में रुचि रखते हैं (डॉकर, प्रतिलिपि प्रस्तुत करने योग्य अनुसंधान, आर पैकेज विकास, एल्गोरिदम, प्रदर्शन अनुकूलन, समानता...) तो नौकरी और व्यवसाय के अवसरों पर चर्चा करने के लिए मुझसे संपर्क करने में संकोच न करें।
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3