"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > Docker_userid_fixer का उपयोग करके डॉकर कंटेनर में उपयोगकर्ता आईडी को ठीक करने का एक शानदार तरीका

Docker_userid_fixer का उपयोग करके डॉकर कंटेनर में उपयोगकर्ता आईडी को ठीक करने का एक शानदार तरीका

2024-11-01 को प्रकाशित
ब्राउज़ करें:280

an elegant way to fix user IDs in docker containers using docker_userid_fixer

यह किस बारे में है?

यह डॉकर कंटेनरों का उपयोग करने में एक तकनीकी समस्या के बारे में है जो डॉकर होस्ट कंप्यूटर के साथ इंटरैक्ट करता है, जो आम तौर पर कंटेनर के अंदर होस्ट फाइल सिस्टम का उपयोग करने से संबंधित है।
ऐसा विशेष रूप से प्रतिलिपि प्रस्तुत करने योग्य अनुसंधान संदर्भ में होता है।
मैंने एक ओपनसोर्स उपयोगिता विकसित की है जो उस समस्या से निपटने में मदद करती है।

निष्पादन वातावरण के रूप में डॉकर कंटेनर

डॉकर कंटेनर का प्रारंभिक और मुख्य उपयोग का मामला: एक स्वयं निहित एप्लिकेशन जो केवल कुछ नेटवर्क पोर्ट के साथ होस्ट सिस्टम के साथ इंटरैक्ट करता है।
एक वेब एप्लिकेशन के बारे में सोचें: डॉकर कंटेनर में आमतौर पर एक वेब सर्वर और एक वेब एप्लिकेशन होता है, उदाहरण के लिए पोर्ट 80 (कंटेनर के अंदर) पर चल रहा है। फिर कंटेनर को होस्ट पर चलाया जाता है, कंटेनर के आंतरिक पोर्ट 80 को होस्ट पोर्ट (जैसे 8000) से बाइंड करके।
फिर कंटेनरीकृत ऐप और होस्ट सिस्टम के बीच एकमात्र इंटरैक्शन इस बाध्य नेटवर्क पोर्ट के माध्यम से होता है।

निष्पादन वातावरण के रूप में कंटेनर पूरी तरह से अलग हैं:

  • किसी एप्लिकेशन को कंटेनरीकृत करने के बजाय, यह एप्लिकेशन बिल्ड सिस्टम है जिसे कंटेनरीकृत किया जाता है।
    • यह एक कंपाइलर, एक आईडीई, एक नोटबुक इंजन, एक क्वार्टो प्रकाशन प्रणाली हो सकती है...
  • लक्ष्य हैं:
    • एक मानक, स्थापित करने और साझा करने में आसान वातावरण
      • आर, पायथन और करोड़ों बाहरी पैकेजों के निश्चित संस्करणों के साथ एक जटिल निर्माण वातावरण की कल्पना करें। हर चीज़ को सही संस्करण के साथ इंस्टॉल करना बहुत कठिन और समय लेने वाला कार्य हो सकता है। पहले से स्थापित और पूर्व-कॉन्फ़िगर की गई सभी चीज़ों वाली डॉकर छवि साझा करने से वास्तविक समय की बचत होती है।
    • एक प्रजनन योग्य वातावरण प्राप्त करने के लिए
      • इसका उपयोग करके, आप कुछ विश्लेषण परिणामों को पुन: पेश करने में सक्षम हैं, क्योंकि आप बहुत ही नियंत्रित वातावरण का उपयोग कर रहे हैं
      • आप बग्स को आसानी से पुन: उत्पन्न भी कर सकते हैं, जो उन्हें ठीक करने का पहला कदम है

लेकिन, उन निष्पादन परिवेशों का उपयोग करने के लिए, उन कंटेनरों के पास होस्ट सिस्टम तक पहुंच होनी चाहिए, विशेष रूप से होस्ट उपयोगकर्ता फ़ाइल सिस्टम तक।

डॉकर कंटेनर और होस्ट फ़ाइल सिस्टम

मान लीजिए आपने एक आईडीई को कंटेनरीकृत किया है, उदाहरण के लिए। रुस्टूडियो.
आपका Rstudio डॉकर कंटेनर के अंदर स्थापित और चल रहा है, लेकिन इसे आपके प्रोजेक्ट फ़ोल्डर में फ़ाइलों को पढ़ने और संपादित करने की आवश्यकता है।

इसके लिए आप docker run --volume विकल्प का उपयोग करके अपने प्रोजेक्ट फ़ोल्डर (अपने होस्ट फ़ाइल सिस्टम में) को बाइंड माउंट करें।
तब आपकी फ़ाइलें डॉकर कंटेनर से पहुंच योग्य होती हैं।

अब चुनौती फ़ाइल अनुमतियाँ हैं। मान लीजिए कि आपके होस्ट उपयोगकर्ता के पास यूजरआईडी 1001 है, और मान लीजिए कि कंटेनर में रुडियो प्रक्रिया का मालिक उपयोगकर्ता या तो 0 (रूट), या 1002 है।

]

यदि कंटेनर उपयोगकर्ता root है, तो उसे आपकी फ़ाइलों को पढ़ने में कोई समस्या नहीं होगी।
लेकिन जैसे ही आप कुछ मौजूदा फ़ाइलों को संपादित करते हैं, नई बनाते हैं (उदाहरण के लिए पीडीएफ, एचटीएमएल), ये फ़ाइलें रूट होस्ट फ़ाइल सिस्टम पर भी होंगी!
मतलब कि आपका स्थानीय होस्ट उपयोगकर्ता उनका उपयोग नहीं कर पाएगा, या उन्हें हटा नहीं पाएगा, क्योंकि वे रूट से संबंधित हैं।

अब यदि कंटेनर उपयोगकर्ता आईडी 1002 है, तो रुस्टूडियो आपकी फ़ाइलों को पढ़ने, उन्हें संपादित करने या नई फ़ाइलें बनाने में सक्षम नहीं हो सकता है।
यदि ऐसा हो भी सकता है, तो कुछ बहुत ही अनुमेय अनुमतियों की सेटिंग के द्वारा, आपका स्थानीय होस्ट उपयोगकर्ता उनका उपयोग करने में सक्षम नहीं हो सकता है।

निश्चित रूप से उस समस्या को हल करने का एक क्रूर तरीका होस्ट कंप्यूटर पर रूट के साथ और डॉकर कंटेनर के साथ चलना है। यह हमेशा संभव नहीं है और कुछ स्पष्ट गंभीर सुरक्षा चिंताओं को जन्म देता है।

फ़ाइल स्वामी समस्या का समाधान भाग 1: docker run --user विकल्प

क्योंकि हम पहले से नहीं जान सकते कि होस्ट उपयोगकर्ता आईडी क्या होगी (यहां 1001), हम पूर्व-कॉन्फ़िगर नहीं कर सकते हैं
डॉकर कंटेनर उपयोगकर्ता की उपयोगकर्ता आईडी।

docker run अब एक --user विकल्प प्रदान करता है जो कुछ आपूर्ति की गई उपयोगकर्ता आईडी के साथ एक छद्म उपयोगकर्ता बनाने में सक्षम बनाता है
चलने के समय पर। उदाहरण के लिए, docker run --user 1001 ... प्रक्रियाओं के साथ चलने वाला एक docker कंटेनर बनाएगा
उपयोगकर्ता आईडी 1001 वाले उपयोगकर्ता से संबंधित।

तो हम अभी भी इस मुद्दे पर क्या चर्चा कर रहे हैं? क्या यह हल नहीं हुआ?

यहां गतिशील रूप से बनाए गए उपयोगकर्ता के बारे में कुछ विचित्रताएं हैं:

  • यह एक छद्म उपयोगकर्ता है
  • इसमें कोई होम निर्देशिका नहीं है (/home/xxx)
  • यह /etc/passwd में प्रकट नहीं होता है
  • इसे पहले से कॉन्फ़िगर नहीं किया जा सकता, उदाहरण के लिए बैश प्रोफाइल, कुछ एनवी वर्र्स, एप्लिकेशन डिफॉल्ट आदि के साथ...

हम इन समस्याओं से निपट सकते हैं, लेकिन यह थकाऊ और निराशाजनक हो सकता है।
हम वास्तव में जो चाहते हैं, वह है डॉकर कंटेनर उपयोगकर्ता को पूर्व-कॉन्फ़िगर करना, और उसके उपयोगकर्ता आईडी को रनटाइम पर गतिशील रूप से बदलने में सक्षम होना...

फ़ाइल स्वामी समस्या का समाधान भाग 2: docker_userid_fixer दर्ज करें

docker_userid_fixer एक ओपन सोर्स उपयोगिता है जिसका उपयोग मेरे द्वारा अभी उठाए गए उपयोगकर्ता आईडी मुद्दे को ठीक करने के लिए docker एंट्रीपॉइंट के रूप में किया जाना है।

आइए देखें कि इसका उपयोग कैसे करें: आप इसे अपने डॉकर ENTRYPOINT के रूप में सेट करते हैं, यह निर्दिष्ट करते हुए कि किस उपयोगकर्ता का उपयोग किया जाना चाहिए और उसका उपयोगकर्ता आईडी गतिशील रूप से संशोधित किया गया है:

ENTRYPOINT ["/usr/local/bin/docker_userid_fixer","user1"]

आइए अपनी शर्तों में सटीक रहें:

  • लक्ष्य उपयोगकर्ता, वह उपयोगकर्ता है जिसने docker_userid_fixer का अनुरोध किया है, यहां user1
  • अनुरोधित उपयोगकर्ता, डॉकर रन द्वारा प्रावधानित उपयोगकर्ता है, यानी वह उपयोगकर्ता जो (शुरुआत में) पहली प्रक्रिया का मालिक है (पीआईडी ​​1)

फिर, कंटेनर रनटाइम निर्माण पर, दो विकल्प हैं:

  • या तो अनुरोधित उपयोगकर्ता आईडी (पहले से ही) लक्ष्य उपयोगकर्ता आईडी से मेल खाता है, तो कुछ भी बदलना नहीं होगा
  • या ऐसा नहीं है। उदाहरण के लिए, अनुरोधित उपयोगकर्ता आईडी 1001 है, और लक्ष्य उपयोगकर्ता आईडी 100 है। फिर, docker_userid_fixer सीधे कंटेनर मुख्य प्रक्रिया में target उपयोगकर्ता user1 की उपयोगकर्ता आईडी को 1000 से 1001 तक ठीक कर देगा।

तो व्यवहार में यह हमारी समस्या का समाधान करता है:

  • यदि आपको अपने कंटेनर उपयोगकर्ता आईडी को ठीक करने की आवश्यकता नहीं है, तो बस सामान्य तरीके से docker run का उपयोग करें (--उपयोगकर्ता विकल्प के बिना)
  • या आप --user विकल्प का उपयोग करते हैं, तो आपके द्वारा अनुरोधित उपयोगकर्ता आईडी के साथ आपकी मुख्य प्रक्रिया को चलाने के अलावा, यह आपके पूर्व-कॉन्फ़िगर उपयोगकर्ता को आपके अनुरोधित उपयोगकर्ता आईडी में संशोधित कर देगा, ताकि आपका कंटेनर आपके इच्छित उपयोगकर्ता और इच्छित के साथ चल सके उपयोगकर्ता पहचान।

docker_userid_fixer सेटअप

आप यहां सेटअप के बारे में निर्देश पा सकते हैं।

लेकिन इसका मतलब यह है:

  • छोटे निष्पादन योग्य (17k) का निर्माण या डाउनलोड करें

  • इसे अपनी डॉकर छवि में कॉपी करें

  • इसे सेतुइड रूट के रूप में निष्पादन योग्य बनाएं

  • इसे अपने प्रवेश बिंदु के रूप में कॉन्फ़िगर करें

रक्तरंजित विवरण

मैंने कुछ संक्षिप्त नोट्स डाले हैं https://github.com/kforner/docker_userid_fixer#how-it-works
लेकिन मैं दोबारा लिखने की कोशिश करूंगा।

कार्यान्वयन का सार कंटेनर में निष्पादन योग्य docker_userid_fixer का setuid रूट है।
उपयोगकर्ता आईडी बदलने के लिए हमें रूट अनुमतियों की आवश्यकता है, और यह सेतुआईडी केवल
के लिए उस विशेषाधिकार प्राप्त निष्पादन को सक्षम बनाता है। docker_userid_fixerprogram, और वह बहुत ही कम समय के लिए।

जरूरत पड़ने पर जैसे ही उपयोगकर्ता आईडी को संशोधित किया जाएगा, docker_userid_fixer मुख्य प्रक्रिया को स्विच कर देगा
अनुरोधित उपयोगकर्ता को (और उपयोगकर्ता आईडी!)।

यदि आप इन विषयों में रुचि रखते हैं (डॉकर, प्रतिलिपि प्रस्तुत करने योग्य अनुसंधान, आर पैकेज विकास, एल्गोरिदम, प्रदर्शन अनुकूलन, समानता...) तो नौकरी और व्यवसाय के अवसरों पर चर्चा करने के लिए मुझसे संपर्क करने में संकोच न करें।

विज्ञप्ति वक्तव्य यह आलेख यहां पुन: प्रस्तुत किया गया है: https://dev.to/kforner/an-elegant-way-to-fix-user-ids-in-docker-containers-using-dockeruseridfixer-3c9i यदि कोई उल्लंघन है, तो कृपया स्टडी_गोलंग से संपर्क करें @163.com हटाएं
नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3