डॉकर साझा संस्करणों के लिए अनुमतियों को प्रबंधित करने का सबसे अच्छा (सबसे अच्छा) तरीका क्या है?


345

मैं थोड़ी देर के लिए डॉकर के साथ खेल रहा हूं और लगातार डेटा से निपटने के दौरान एक ही मुद्दा ढूंढता रहता हूं।

मैं अपना निर्माण करता हूं Dockerfileऔर एक मात्रा का उपयोग करता हूं या अपने कंटेनर के अंदर एक होस्ट फ़ोल्डर माउंट करने के --volumes-fromलिए उपयोग करता हूं

मुझे होस्ट पर साझा किए गए वॉल्यूम के लिए क्या अनुमतियाँ लागू करनी चाहिए?

मैं दो विकल्पों के बारे में सोच सकता हूं:

  • अब तक मैंने सभी को पढ़ने / लिखने की पहुंच दी है, इसलिए मैं डॉकटर कंटेनर से फ़ोल्डर में लिख सकता हूं।

  • कंटेनर में होस्ट से उपयोगकर्ताओं को मैप करें, इसलिए मैं अधिक दानेदार अनुमतियाँ असाइन कर सकता हूं। सुनिश्चित नहीं है कि यह संभव है और इसके बारे में बहुत कुछ नहीं मिला है। अब तक, मैं केवल कुछ उपयोगकर्ता के रूप में कंटेनर चला सकता हूं: docker run -i -t -user="myuser" postgresलेकिन इस उपयोगकर्ता के पास मेरे होस्ट की तुलना में एक अलग यूआईडी है myuser, इसलिए अनुमतियाँ काम नहीं करती हैं। साथ ही, मैं अनिश्चित हूं कि यदि उपयोगकर्ता मैपिंग करते हैं तो कुछ सुरक्षा जोखिम होंगे।

क्या अन्य विकल्प हैं?

आप लोग / gals इस मुद्दे से कैसे निपट रहे हैं?



1
: आप भी इस धागे जो कुछ विस्तार से इस विषय पर चर्चा में रुचि हो सकती groups.google.com/forum/#!msg/docker-user/cVov44ZFg_c/...
btiernay

1
आपने कंटेनर42 . com/2014/11/18/data-only- container-madness देखा ?
फिलिप

फिलहाल, डॉकर टीम निर्दिष्ट यूआईडी / जीआईडी ​​के साथ वॉल्यूम के रूप में बढ़ते मेजबान-निर्देशिकाओं के लिए एक देशी समाधान को लागू करने की योजना नहीं बना रही है। इस मुद्दे पर मेरी टिप्पणी और उत्तर देखें: github.com/docker/docker/issues/7198#issuecomment-230636074
क्विन कंटेंडर

जवाबों:


168

अद्यतन 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/graphiteDockerfile भी एक ही 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/graphitetoolssome/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 : मैंने इस उत्तर को सही किया और अधिक बारीकियों को जोड़ा। इसमें पहले स्वामित्व और परमिट के बारे में कुछ गलत धारणाएं शामिल थीं - स्वामित्व आमतौर पर वॉल्यूम निर्माण के समय यानी डेटा कंटेनर में असाइन किया जाता है, क्योंकि जब वॉल्यूम बनाया जाता है। इस ब्लॉग को देखें । यह एक आवश्यकता नहीं है, हालांकि - आप डेटा कंटेनर को "संदर्भ / संभाल" के रूप में उपयोग कर सकते हैं और एक एंट्रीपॉइंट में चाउन के माध्यम से दूसरे कंटेनर में स्वामित्व / परमिट सेट कर सकते हैं, जो सही उपयोगकर्ता के रूप में कमांड को चलाने के लिए गोसु के साथ समाप्त होता है। अगर किसी को इस दृष्टिकोण में दिलचस्पी है, तो कृपया टिप्पणी करें और मैं इस दृष्टिकोण का उपयोग करके एक नमूने के लिंक प्रदान कर सकता हूं।


35
मुझे डर है कि यह एक समाधान नहीं है क्योंकि आपके पास डेटा-केवल कंटेनरों के साथ एक ही मुद्दा होगा। दिन के अंत में, यह कंटेनर होस्ट से साझा किए गए संस्करणों का उपयोग करेगा, इसलिए आपको अभी भी उन साझा किए गए फ़ोल्डरों पर अनुमतियों को प्रबंधित करने की आवश्यकता होगी।
Xabs

2
ध्यान रखें कि मुझे अपने होस्ट से डेटा फ़ोल्डर को संपादित करने की आवश्यकता हो सकती है (यानी: एक टेस्ट ग्रेफाइट कुंजी हटाएं, मेरा JIRA टेस्ट होम फ़ोल्डर हटाएं या इसे नवीनतम उत्पादन बैकअप के साथ अपडेट करें ...)। जहां तक ​​मैं आपकी टिप्पणी से समझता हूं, मुझे एक 3 कंटेनर के माध्यम से JIRA डेटा अपडेट करने जैसी चीजें करनी चाहिए। किसी भी स्थिति में, आप एक नए डेटा फ़ोल्डर में क्या अनुमतियाँ लागू करेंगे /data/newcontainer? मुझे लगता है कि आप dockerरूट के रूप में चलाते हैं (क्या ऐसा करना संभव नहीं है?) इसके अलावा, क्या उन अनुमतियों में कोई अंतर है यदि डेटा सीधे मुख्य कंटेनर में या डेटा-केवल कंटेनर के माध्यम से माउंट किया जाता है ?
10

2
आपके विस्तृत उत्तर के लिए धन्यवाद। मौका मिलते ही इसका परीक्षण करूंगा। इसके अलावा, आपके ब्लॉग पोस्ट और डेटा कंटेनरों के लिए न्यूनतम छवियों का उपयोग करने के बारे में अच्छा संदर्भ ।
Xabs

3
इस दृष्टिकोण के साथ एकमात्र समस्या यह है कि गलती से एक कंटेनर को हटाना बहुत आसान है। सोचिए अगर ऐसा होता है तो आपका डेटा कंटेनर। मुझे लगता है कि (CMIIW) डेटा अभी भी /var/lib/dockerकहीं और होगा लेकिन अभी भी एक बड़ा दर्द है
lolski

3
"आप डेटा कंटेनर को" संदर्भ / संभाल "के रूप में उपयोग कर सकते हैं और किसी अन्य कंटेनर में स्वामित्व / परमिट सेट कर सकते हैं, जो एक प्रविष्टि में चाउन के माध्यम से हो सकता है" ... @Raman: यह वह खंड है जिसने अंततः कई अनुमति मुद्दों के न होने के बाद मुझे बचाया था। पता लगाया। एंट्रीपॉइंट स्क्रिप्ट का उपयोग करना और मेरे लिए इस काम में अनुमतियाँ सेट करना। आपके विस्तृत विवरण के लिए धन्यवाद। यह वेब पर मुझे अब तक मिला सबसे अच्छा है।
वन्डरस्टाॅज

59

एक बहुत ही सुरुचिपूर्ण समाधान आधिकारिक रेडिस छवि और सामान्य रूप से सभी आधिकारिक छवियों में देखा जा सकता है ।

चरण-दर-चरण प्रक्रिया में वर्णित:

  • किसी अन्य चीज़ से पहले redis user / group बनाएं

Dockerfile टिप्पणियों पर देखा के रूप में:

हमारे उपयोगकर्ता और समूह को पहले यह सुनिश्चित करने के लिए जोड़ें कि उनकी आईडी लगातार नियत की जाए, चाहे जो भी निर्भरताएं जोड़ी जाएं

  • गोसेफ को डॉकरफाइल के साथ स्थापित करें

Gosu के लिए एक विकल्प है su/ sudoजड़ उपयोगकर्ता से आसान स्टेप-डाउन के लिए। (Redis हमेशा redisउपयोगकर्ता के साथ चलाया जाता है )

  • /dataवॉल्यूम कॉन्फ़िगर करें और इसे कार्यदिवस के रूप में सेट करें

VOLUME /dataकमांड के साथ / डेटा वॉल्यूम को कॉन्फ़िगर करके अब हमारे पास एक अलग वॉल्यूम है जो या तो होस्ट वॉल्यूम के लिए डॉक वॉल्यूम या बाइंड-माउंटेड हो सकता है।

इसे कार्यदिवस ( WORKDIR /data) के रूप में कॉन्फ़िगर करना इसे डिफ़ॉल्ट निर्देशिका बनाता है जहां से कमांड निष्पादित होते हैं।

  • Docker-entrypoint फ़ाइल जोड़ें और इसे डिफ़ॉल्ट CMD रेडिस-सर्वर के साथ ENTRYPOINT के रूप में सेट करें

इसका मतलब यह है कि सभी कंटेनर निष्पादन डॉक-एंट्रीपॉइंट स्क्रिप्ट के माध्यम से चलेंगे, और डिफ़ॉल्ट रूप से चलाने के लिए कमांड रेडिस-सर्वर है।

docker-entrypointएक स्क्रिप्ट है जो एक साधारण कार्य करती है: वर्तमान निर्देशिका (/ डेटा) का स्वामित्व बदलें और उपयोगकर्ता को चलाने के rootलिए चरण-डाउन redisकरें redis-server। (यदि निष्पादित कमांड रेडिस-सर्वर नहीं है, तो यह कमांड को सीधे चलाएगा।)

इसका निम्नलिखित प्रभाव है

यदि / डेटा निर्देशिका होस्ट पर बाइंड-माउंटेड है, तो डॉक-एंट्रीपॉइंट उपयोगकर्ता के लिए रेडिस-सर्वर चलाने से पहले उपयोगकर्ता की अनुमति तैयार करेगा redis

यह आपको आसानी से मन देता है कि किसी भी वॉल्यूम कॉन्फ़िगरेशन के तहत कंटेनर को चलाने के लिए शून्य-सेटअप है।

बेशक अगर आपको अलग-अलग छवियों के बीच वॉल्यूम साझा करने की आवश्यकता है, तो आपको यह सुनिश्चित करने की आवश्यकता है कि वे एक ही उपयोगकर्ता / समूह का उपयोग करते हैं अन्यथा नवीनतम कंटेनर उपयोगकर्ता अनुमतियों को पिछले एक से अपहरण कर लेगा।


11
स्वीकृत उत्तर जानकारीपूर्ण है, लेकिन इसने मुझे इस उत्तर को खोजने के लिए अनुमतियों के साथ निराशा के एक सप्ताह के पथ का नेतृत्व किया जो वास्तव में समस्या को हल करने के लिए एक विहित तरीका प्रदान करता है।
m0meni

3
बहुत अच्छी तरह से यहाँ भी समझाया गया: denibertovic.com/posts/handling-permissions-with-docker-volumes
kheraud

इसलिए? मैं डॉकटर के अंदर से वॉल्यूम कैसे बनाऊं? chownयह ENTRYPOINTस्क्रिप्ट के अंदर है ?
घमरन

34

यह यकीनन अधिकांश परिस्थितियों के लिए सबसे अच्छा तरीका नहीं है, लेकिन इसका उल्लेख अभी तक नहीं किया गया है इसलिए शायद यह किसी की मदद करेगा।

  1. बाइंड माउंट होस्ट वॉल्यूम

    Host folder FOOBAR is mounted in container /volume/FOOBAR

  2. जिस कंटेनर में आप रुचि रखते हैं, उसका GID खोजने के लिए अपने कंटेनर की स्टार्टअप स्क्रिप्ट को संशोधित करें

    $ TARGET_GID=$(stat -c "%g" /volume/FOOBAR)

  3. सुनिश्चित करें कि आपका उपयोगकर्ता इस GID वाले समूह से संबंधित है (आपको एक नया समूह बनाना पड़ सकता है)। इस उदाहरण के लिए मैं अपने सॉफ़्टवेयर को nobodyदिखाऊँगा कि कंटेनर के अंदर उपयोगकर्ता के रूप में चलता है , इसलिए मैं यह सुनिश्चित करना चाहता हूं कि nobodyएक समूह आईडी के बराबर समूह से संबंधित होTARGET_GID

  EXISTS=$(cat /etc/group | grep $TARGET_GID | wc -l)

  # Create new group using target GID and add nobody user
  if [ $EXISTS == "0" ]; then
    groupadd -g $TARGET_GID tempgroup
    usermod -a -G tempgroup nobody
  else
    # GID exists, find group name and add
    GROUP=$(getent group $TARGET_GID | cut -d: -f1)
    usermod -a -G $GROUP nobody
  fi

मुझे यह पसंद है क्योंकि मैं अपने होस्ट वॉल्यूम पर समूह अनुमतियों को आसानी से संशोधित कर सकता हूं और यह जान सकता हूं कि अपडेट की गई अनुमतियाँ डॉकटर कंटेनर के अंदर लागू होती हैं। यह मेरे होस्ट फ़ोल्डर / फ़ाइलों के लिए किसी भी अनुमति या स्वामित्व संशोधनों के बिना होता है, जो मुझे खुश करता है।

मुझे यह पसंद नहीं है क्योंकि यह मानता है कि कंटेनर के अंदर एक मनमाने समूहों को जोड़ने में कोई खतरा नहीं है जो कि आप चाहते हैं एक जीआईडी ​​का उपयोग कर रहे हैं। इसका उपयोग USERडॉकरफाइल में एक क्लॉज के साथ नहीं किया जा सकता है (जब तक कि उपयोगकर्ता के पास रूट विशेषाधिकार नहीं हैं मुझे लगता है)। इसके अलावा, यह हैक काम चिल्लाती है ;-)

यदि आप कट्टर बनना चाहते हैं, तो आप स्पष्ट रूप से इसे कई तरीकों से बढ़ा सकते हैं - जैसे कि किसी भी सबफाइल्स, कई संस्करणों, आदि पर सभी समूहों की खोज करें।


4
क्या यह माउंटेड वॉल्यूम से फाइल पढ़ने पर लक्षित है ? मैं उनके बिना फ़ाइलों को लिखने के लिए एक समाधान की तलाश कर रहा हूं जो उनके द्वारा किसी अन्य उपयोगकर्ता के स्वामित्व में हैं, जिन्होंने डॉकर कंटेनर बनाया है।
थोरसुमोनर

मैं अगस्त 15 से इस दृष्टिकोण का उपयोग कर रहा हूं। सब कुछ ठीक था। बस कंटेनर के अंदर बनाई गई फ़ाइलों की अनुमतियाँ अलग थीं। दोनों, उपयोगकर्ताओं (कंटेनर के अंदर और बाहर) के पास उनकी फ़ाइलों की स्वामित्व है लेकिन दोनों ने उन्हें पढ़ा था क्योंकि वे इस समाधान द्वारा बनाए गए एक ही समूह से संबंधित थे। समस्या तब शुरू हुई जब एक उपयोग के मामले ने सामान्य फ़ाइलों तक लिखने की पहुंच बाधित कर दी। अधिक से अधिक समस्या यह थी कि साझा वॉल्यूम में गिट फाइलें थीं (इसकी एक ही उत्पादन संदर्भ में देव स्रोत फ़ाइलों का परीक्षण करने के लिए एक वॉल्यूम)। साझा कोड तक पहुंच समस्या के बारे में चेतावनी देना शुरू कर दिया।
yucer

मुझे लगता है कि $TARGET_GIDउपयोग करने के लिए एक बेहतर grep होगा grep ':$TARGET_GID:', अन्यथा अगर कंटेनर में है, उदाहरण के लिए 10001 gid और आपका होस्ट 1000 है, तो यह चेक पास हो जाएगा, लेकिन ऐसा नहीं होना चाहिए।
रॉबडसन

16

ठीक है, यह अब docker के मुद्दे पर # 7198 पर नज़र रखी जा रही है

अभी के लिए, मैं आपके दूसरे विकल्प का उपयोग करके इससे निपट रहा हूं:

कंटेनर में होस्ट से उपयोगकर्ताओं को मैप करें

Dockerfile

#=======
# Users
#=======
# TODO: Idk how to fix hardcoding uid & gid, specifics to docker host machine
RUN (adduser --system --uid=1000 --gid=1000 \
        --home /home/myguestuser --shell /bin/bash myguestuser)

CLI

# DIR_HOST and DIR_GUEST belongs to uid:gid 1000:1000
docker run -d -v ${DIR_HOST}:${DIR_GUEST} elgalu/myservice:latest

अद्यतन मैं वर्तमान में Hamy उत्तर के लिए अधिक इच्छुक हूं


1
आदेश का उपयोग करें id -u <username>, id -g <username>, id -G <username>बजाय प्रयोक्ता आईडी और एक विशिष्ट उपयोगकर्ता के समूह आईडी प्राप्त करने के लिए
lolski


15
यह मेजबान भर में कंटेनर पोर्टेबिलिटी को नष्ट कर देता है।
रमन

2
डॉकर मुद्दा # 7198 इस निष्कर्ष पर पहुंचा है कि वे इसके लिए एक देशी समाधान लागू नहीं करेंगे। मेरी टिप्पणी एक उत्तर में मिलते हैं github.com/docker/docker/issues/7198#issuecomment-230636074
क्विन Comendant


12

आप के रूप में, मैं होस्ट / डॉक कंटेनर में उपयोगकर्ताओं / समूहों को मैप करने का एक तरीका ढूंढ रहा था और यह अब तक का सबसे छोटा तरीका है:

  version: "3"
    services:
      my-service:
        .....
        volumes:
          # take uid/gid lists from host
          - /etc/passwd:/etc/passwd:ro
          - /etc/group:/etc/group:ro
          # mount config folder
          - path-to-my-configs/my-service:/etc/my-service:ro
        .....

यह मेरे docker-compose.yml से एक उद्धरण है।

यह विचार है कि (रीड-ओनली मोड में) उपयोगकर्ता / समूह होस्ट से कंटेनर की सूची बनाते हैं, इस प्रकार कंटेनर के शुरू होने के बाद इसमें यूआईडी-> उपयोगकर्ता नाम (साथ ही समूहों के लिए) होस्ट के साथ मिलान होगा। अब आप कंटेनर के अंदर अपनी सेवा के लिए उपयोगकर्ता / समूह सेटिंग्स को कॉन्फ़िगर कर सकते हैं जैसे कि यह आपके होस्ट सिस्टम पर काम कर रहा हो।

जब आप अपने कंटेनर को किसी अन्य होस्ट में ले जाने का निर्णय लेते हैं, तो आपको बस उस होस्ट पर आपके पास मौजूद सेवा फ़ाइल में उपयोगकर्ता नाम बदलने की आवश्यकता होती है।


यह एक महान जवाब है, बहुत आसान है अगर आप कंटेनर को चलाना चाहते हैं जो आधार प्रणाली पर फ़ाइलों को संभालते हैं, बाकी सिस्टम को उजागर किए बिना।
icarito

यह मेरा पसंदीदा उत्तर है। इसके अलावा, मैंने docker रन कमांड के साथ कहीं और इसी तरह की सिफारिश देखी, जहां आप अपने वर्तमान उपयोगकर्ता नाम / समूहों में से गुजरते हैं -u $( id -u $USER ):$( id -g $USER )और अब आपको उपयोगकर्ता नाम के बारे में चिंता करने की आवश्यकता नहीं है। यह स्थानीय देव परिवेशों के लिए अच्छी तरह से काम करता है जहाँ आप फ़ाइलों (उदाहरण के लिए बायनेरिज़) को उत्पन्न करना चाहते हैं, जिसे आपने डिफ़ॉल्ट रूप से पढ़ा / लिखा है।
मैथ्यूकुम्मिंग्स 516

5

यहां एक दृष्टिकोण है जो अभी भी एक डेटा-केवल कंटेनर का उपयोग करता है, लेकिन इसे एप्लिकेशन कंटेनर (समान यूआईडी / जीआईडी ​​होने के संदर्भ में) के साथ समन्वयित करने की आवश्यकता नहीं है।

संभवतया, आप कंटेनर में एक गैर-रूट $ USER के रूप में लॉगिन शेल के बिना कुछ ऐप चलाना चाहते हैं।

डॉकरफाइल में:

RUN useradd -s /bin/false myuser

# Set environment variables
ENV VOLUME_ROOT /data
ENV USER myuser

...

ENTRYPOINT ["./entrypoint.sh"]

फिर, entrypoint.sh में:

chown -R $USER:$USER $VOLUME_ROOT
su -s /bin/bash - $USER -c "cd $repo/build; $@"

5

डॉक कंटेनर के लिए सुरक्षित और परिवर्तन रूट के लिए एक डॉक होस्ट प्रयास --uidmapऔर --private-uidsविकल्पों का उपयोग करें

https://github.com/docker/docker/pull/4572#issuecomment-38400893

इसके अलावा, आप --cap-dropसुरक्षा के लिए docker कंटेनर में कई क्षमताएं ( ) हटा सकते हैं

http://opensource.com/business/14/9/security-for-docker

अद्यतन समर्थन में आना चाहिएdocker > 1.7.0

अद्यतन संस्करण 1.10.0(2016-02-04) --userns-remapझंडा जोड़ें https://github.com/docker/docker/blob/master/CHANGELOG.md#security-2


मैं 39.22fa (नवीनतम) का निर्माण कर रहा हूँ। 1.3.2 और --uidmapन ही --private-uidsविकल्पों में से कोई निशान नहीं देख रहा हूँ । ऐसा लगता है कि पीआर ने इसे नहीं बनाया और विलय नहीं किया था।
लियो गैलुक्की

यह कोर में मर्ज नहीं है, अगर आप चाहते हैं कि आप इसे कैसे पैच का उपयोग कर सकते हैं। अब केवल कुछ क्षमताओं को सीमित करना संभव है और आपको गैर रूट उपयोगकर्ता से कंटेनर में आवेदन करना है।
umount

जून २०१५ और मुझे यह नहीं दिख रहा है कि १.६.२ में काम करने वाला आपका जवाब अभी भी मान्य है?
सिंह गैलुकि

1
मुद्दा अभी भी खुला है। डेवलपर को 1.7 संस्करण में समर्थन जोड़ना चाहिए। (--root विकल्प) github.com/docker/docker/pull/12648
umount

2
ऐसा लगता है कि डेवलपर्स ने एक बार फिर इस कार्यक्षमता के साथ रिलीज को स्थानांतरित कर दिया। Docker डेवलपर "icecrime" का कहना है कि "We apparently do have so some of conflicting designs between libnetwork and user namespaces ... and something we'd like to get in for 1.8.0. So don't think we're dropping this, we're definitely going to take a break after all these, and see how we need to reconsider the current design and integration of libnetwork to make this possible. Thanks!" github.com/docker/docker/pull/12648 इसलिए मुझे लगता है कि हमें अगले स्थिर संस्करण का इंतजार करना चाहिए।
umount

4

मेरा दृष्टिकोण वर्तमान यूआईडी / जीआईडी ​​का पता लगाना है, फिर कंटेनर के अंदर ऐसे उपयोगकर्ता / समूह बनाएं और उसके तहत स्क्रिप्ट निष्पादित करें। परिणामस्वरूप वह जो भी फाइलें बनाएगा, वह मेजबान पर उपयोगकर्ता से मेल खाएगा (जो कि स्क्रिप्ट है):

# get location of this script no matter what your current folder is, this might break between shells so make sure you run bash
LOCAL_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

# get current IDs
USER_ID=$(id -u)
GROUP_ID=$(id -g)

echo "Mount $LOCAL_DIR into docker, and match the host IDs ($USER_ID:$GROUP_ID) inside the container."

docker run -v $LOCAL_DIR:/host_mount -i debian:9.4-slim bash -c "set -euo pipefail && groupadd -r -g $GROUP_ID lowprivgroup && useradd -u $USER_ID lowprivuser -g $GROUP_ID && cd /host_mount && su -c ./runMyScriptAsRegularUser.sh lowprivuser"

3

आधार छवि

इस चित्र का उपयोग करें: https://hub.docker.com/r/reduardo7/docker-host-user

या

महत्वपूर्ण: यह मेजबान भर में कंटेनर पोर्टेबिलिटी को नष्ट कर देता है

1) init.sh

#!/bin/bash

if ! getent passwd $DOCKDEV_USER_NAME > /dev/null
  then
    echo "Creating user $DOCKDEV_USER_NAME:$DOCKDEV_GROUP_NAME"
    groupadd --gid $DOCKDEV_GROUP_ID -r $DOCKDEV_GROUP_NAME
    useradd --system --uid=$DOCKDEV_USER_ID --gid=$DOCKDEV_GROUP_ID \
        --home-dir /home --password $DOCKDEV_USER_NAME $DOCKDEV_USER_NAME
    usermod -a -G sudo $DOCKDEV_USER_NAME
    chown -R $DOCKDEV_USER_NAME:$DOCKDEV_GROUP_NAME /home
  fi

sudo -u $DOCKDEV_USER_NAME bash

2) Dockerfile

FROM ubuntu:latest
# Volumes
    VOLUME ["/home/data"]
# Copy Files
    COPY /home/data/init.sh /home
# Init
    RUN chmod a+x /home/init.sh

3) दौड़

#!/bin/bash

DOCKDEV_VARIABLES=(\
  DOCKDEV_USER_NAME=$USERNAME\
  DOCKDEV_USER_ID=$UID\
  DOCKDEV_GROUP_NAME=$(id -g -n $USERNAME)\
  DOCKDEV_GROUP_ID=$(id -g $USERNAME)\
)

cmd="docker run"

if [ ! -z "${DOCKDEV_VARIABLES}" ]; then
  for v in ${DOCKDEV_VARIABLES[@]}; do
    cmd="${cmd} -e ${v}"
  done
fi

# /home/usr/data contains init.sh
$cmd -v /home/usr/data:/home/data -i -t my-image /home/init.sh

4) के साथ बनाएँ docker

4) भागो!

sh run.sh

0

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

स्थानीय मशीन में कॉपी की गई फाइलें यूआईडी: जीआईडी ​​के उपयोगकर्ता के साथ बनाई जाती हैं, जो डॉक सीपी कमांड को आमंत्रित करता है।

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

NODE_IMAGE=node_builder
docker run -v $(pwd)/build:/build -w="/build" --name $NODE_IMAGE node:6-slim npm i --production
# node_modules is owned by root, so we need to copy it out 
docker cp $NODE_IMAGE:/build/node_modules build/lambda 
# you might have issues trying to remove the directory "node_modules" within the shared volume "build", because it is owned by root, so remove the image and its volumes
docker rm -vf $NODE_IMAGE || true

यदि आवश्यक हो, तो आप दूसरे डॉकटर कंटेनर के साथ निर्देशिका को हटा सकते हैं।

docker run -v $(pwd)/build:/build -w="/build" --name $RMR_IMAGE node:6-slim rm -r node_modules

0

डॉक होस्ट और डॉकटर कंटेनर के बीच फ़ोल्डर साझा करने के लिए, कमांड के नीचे प्रयास करें

$ docker रन -v "$ (pwd): $ (pwd)" -i -t ubuntu

-V ध्वज वर्तमान कार्यशील निर्देशिका को कंटेनर में रखता है। जब बाइंड-माउंटेड वॉल्यूम की होस्ट निर्देशिका मौजूद नहीं है, तो डॉकर आपके लिए होस्ट पर यह निर्देशिका स्वचालित रूप से बनाएगा,

हालाँकि, हमारे यहाँ 2 समस्याएं हैं:

  1. यदि आप गैर-रूट उपयोगकर्ता थे, तो आप वॉल्यूम पर नहीं लिख सकते क्योंकि साझा फ़ाइल होस्ट में अन्य उपयोगकर्ता के स्वामित्व में होगी,
  2. आपको अपने कंटेनर के अंदर की प्रक्रिया को रूट के रूप में नहीं चलाना चाहिए, लेकिन अगर आप कुछ हार्ड-कोडेड उपयोगकर्ता के रूप में चलाते हैं, तब भी यह उपयोगकर्ता को आपके लैपटॉप / जेनकींस से मेल नहीं खाएगा,

समाधान:

कंटेनर: एक उपयोगकर्ता बनाएं 'testuser', डिफ़ॉल्ट रूप से उपयोगकर्ता आईडी 1000 से शुरू होगी,

होस्ट: समूह आईडी 1000 के साथ एक समूह 'टेस्टग्रुप' बनाएं, और डायरेक्टरी को नए समूह (टेस्टग्रुप) तक पहुंचाएं


-5

यदि आप डॉकर कम्पोज़ का उपयोग कर रहे हैं, तो कंटेनर को प्रचलित मोड में शुरू करें:

wordpress:
    image: wordpress:4.5.3
    restart: always
    ports:
      - 8084:80
    privileged: true

2
इससे वॉल्यूम को माउंट करना आसान हो सकता है लेकिन .. वर्डप्रेस को निजीकृत मोड में लॉन्च किया गया है? यह एक भयानक विचार है - जो समझौता करने के लिए कह रहा है। wpvulndb.com/wordpresses/453
कॉलिन हैरिंगटन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.