मैं एक डॉकर कंटेनर के अंदर एक नामस्थान के अंदर एक निजी /खरीद कैसे माउंट करूं?

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

यह काम करता है:

$ sudo docker run --privileged --security-opt=seccomp=unconfined \ -it fedora:rawhide /usr/bin/unshare -Ufmp -r \ /bin/sh -c 'mount -t proc proc /proc'

यह नहीं करता है:

$ sudo docker run --cap-add=sys_admin --security-opt=seccomp=unconfined \  -it fedora:rawhide /usr/bin/unshare -Ufmp -r \   /bin/sh -c 'mount -t proc proc /proc'mount: /proc: cannot mount proc read-only.

तो, बस सेकम्प फ़िल्टर बंद करना और जोड़ना CAP_SYS_ADMIN पर्याप्त नहीं है । क्या है पर्याप्त?

अद्यतन करें: सेलिनक्स समस्या का एक हिस्सा है । यदि आप विश्व स्तर पर सेलिनक्स प्रवर्तन को बंद करते हैं, तो यह काम करता है । लेकिन, आप किसी विशेष कंटेनर के लिए प्रवर्तन को बंद भी कर सकते हैं --security-opt label:disable, और यह में प्रलेखित है ऑनलाइन डॉकर मैनुअल का सुरक्षा कॉन्फ़िगरेशन अनुभाग:

sudo docker run --cap-add=sys_admin --security-opt label:disable \ -it fedora:rawhide /usr/bin/unshare -fmp /bin/sh -c \ 'mount --make-private / ; mount -t proc proc /proc'

लेकिन वह विफल रहता है अगर -U और -r झंडे वापस जोड़े जाते हैं unshare. और, बेशक, जोड़ना --privileged डॉकर रन कमांड के साथ भी ठीक काम करता है -U और -r झंडे।

मैं वर्तमान में कर्नेल ट्रेसिंग सामान का उपयोग करने की कोशिश कर रहा हूं ताकि यह पता लगाया जा सके कि वास्तव में, मुझे एक एपर्म दे रहा है । यह प्राप्त करने के लिए एक बहुत ही अनुपयोगी अनिर्दिष्ट त्रुटि है ।

यह आदेश काम करता है:

sudo docker run --cap-add=sys_admin --security-opt label:disable -it fedora:rawhide /bin/sh -c 'for dir in $(awk '"'"'/\/proc\// { print $5; }'"'"' /proc/1/mountinfo ); do umount "$dir"; done; /usr/bin/unshare -Ufmp -r /bin/sh -c '"'"'mount --make-private / ; mount -t proc proc /proc ; ls /proc'"'"

मैंने इसे कई पंक्तियों में विभाजित नहीं किया क्योंकि उद्धरण वास्तव में महत्वपूर्ण है । असल में, यह सामान की एक पूरी गुच्छा को अनमाउंट करता है /proc अनशेयर और माउंटिंग चलाने से पहले /proc चाइल्ड यूजर नेमस्पेस में ।

डॉकर निर्देशिकाओं और फ़ाइलों के एक समूह पर माउंट करता है /proc अपनी स्वयं की निर्देशिकाओं के साथ जो खाली टीएमपीएफएस निर्देशिका और नल फाइलें हैं । में विभिन्न फाइलें /proc उन मूल्यों का प्रतिनिधित्व करें जो पूरे सिस्टम पर लागू होते हैं । वास्तव में, /proc/kcore यदि आप रूट थे, तो आपको कंटेनर के अंदर कर्नेल मेमोरी पढ़ने की अनुमति देगा, क्योंकि बहुत से लोग यह मानना चाहते हैं कि कंटेनर किसी प्रकार के हल्के वीएम या कुछ और हैं, बहुत से लोगों को आश्चर्यचकित करेंगे ।

कर्नेल में (वैसे भी संस्करण 4.14 के रूप में) fs/namespace.c:mnt_already_visible यह देखने के लिए जांचता है कि क्या आप पहले से ही माउंटेड फाइल सिस्टम को माउंट कर रहे हैं, और यदि उस फाइल सिस्टम में चाइल्ड फाइल सिस्टम के रूप में माउंट की गई चीजें हैं और उन माउंट्स में एमएनटी_लॉक फ्लैग है, तो यह विफल हो जाता है । के MNT_LOCKED झंडा लगता है, करने के लिए लागू किया जा सकता है (मैं नहीं था नीचे का शिकार जहां यह है कर्नेल में) सभी के लिए mounts जब भी आप बनाने के लिए एक उपयोगकर्ता नाम स्थान को रोकने के क्रम में, आप से unmounting में बातें है कि नामस्थान (क्योंकि आप विशेषाधिकार 'के भीतर उपयोगकर्ता नाम स्थान) और छिपा सामान फिर से दिखाई.

मेरे द्वारा पोस्ट की गई कमांड की सामग्री पर एक अजीब स्क्रिप्ट का उपयोग करता है /proc/1/mountinfo सभी उपनिर्देशिकाओं और फाइलों को बाहर निकालने के लिए /proc वह डॉकर ऊपर चढ़ गया है, और उन सभी को अनमाउंट करता है । यह बनाता है /proc नेस्टेड उपयोगकर्ता नामस्थान में फिर से माउंट करने योग्य फाइल सिस्टम ।

फ़्रीनोड पर #डॉकर चैनल पर समापल यहां बहुत मददगार रहा है, और यह एक सीजीयूपीएस मुद्दा हो सकता है । एक ‘डिवाइस’ सीग्रुप प्रतीत होता है ।

यह आपकी मदद नहीं करेगा, लेकिन टीबीएच: मैं वास्तव में आश्चर्यचकित हूं कि यह एक मानक माउंट विकल्प नहीं है क्योंकि यह मेरे लिए एक बहुत ही सामान्य आवश्यकता है । मुझे इसकी आवश्यकता है:) । … मैं एक एकल बाइनरी चला रहा हूं और इसके सभी पुस्तकालयों को शामिल कर रहा हूं, इसलिए कंटेनर में बेस-ओ/एस की कोई आवश्यकता नहीं है - इसलिए मेरे पास एक नहीं है, लेकिन यह कुछ सुविधाओं के लिए /खरीद चाहता है । स्थिर बायनेरिज़ के साथ भी ऐसा ही होगा, जैसे गो वाले - उन्हें कंटेनर में बेस-ओ/एस के बिना स्थापित किया जा सकता है । मैंने -वी /प्रोक:/प्रोक की कोशिश की और यह आपके द्वारा दिए गए कारण के लिए मदद नहीं करता है ।

आप की कोशिश की है का उपयोग कर -v /proc:/proc ?

@सी 4 एफ 4 टी 0 आर-ठीक है, यह वह नहीं करेगा जो मैं चाहता हूं । मैं नहीं चाहता कि नामस्थान डॉकर से /प्रोक चल रहा है (संभवतः रूट स्तर नेमस्पेस) ।

@सी 4 एफ 4 टी 0 आर-एफट्रेस, कर्नेल स्रोतों और कुछ रचनात्मक सोच का उपयोग करके, मैंने समस्या का पता लगाया । security - How do I mount a private /proc inside a namespace inside a docker container? - Server Fault