2015-03-04 30 views
12

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

मैं EncFS उपयोग करने के लिए कोशिश कर रहा हूँ -, यह मेजबान पर अच्छी तरह से काम जैसे:

encfs/एन्क्रिप्टेड/दिखाई

मैं करने के लिए/दिखाई देने वाली फ़ाइलें लिख सकते हैं, और उन एन्क्रिप्टेड मिल । हालांकि, जब/के साथ एक कंटेनर मात्रा, जैसे के रूप में दिखाई भागने की कोशिश कर:

डोकर रन मैं आयकर --privileged -v/दिखाई:/myvolume imagename बैश

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

क्या डॉकर एनकएफएस के माध्यम से वॉल्यूम माउंट करने का कोई तरीका है, और सीधे फ़ोल्डर में नहीं लिखता है? इसके विपरीत, जब मैं एनएफएस माउंट को वॉल्यूम के रूप में उपयोग करता हूं तो डॉकर ठीक काम करता है। यह नेटवर्क डिवाइस को लिखता है, न कि उस स्थानीय फ़ोल्डर पर जिस पर मैंने डिवाइस को घुमाया था।

धन्यवाद

उत्तर

12

मैं स्थानीय रूप से आपकी समस्या को डुप्लिकेट करने में असमर्थ हूं। अगर मैं एक डोकर मात्रा के रूप में एक encfs फाइल सिस्टम को बेनकाब करने की कोशिश, मैं एक त्रुटि कंटेनर शुरू करने की कोशिश मिलती है:

FATA[0003] Error response from daemon: Cannot start container <cid>: 
setup mount namespace stat /visible: permission denied 

तो यह आप के लिए कुछ अलग हो रहा है संभव है। किसी भी मामले में, यह मेरी समस्या का समाधान करता है:

डिफ़ॉल्ट रूप से, FUSE केवल उस उपयोगकर्ता को अनुमति देता है जिसने फाइल सिस्टम को उस फाइल सिस्टम तक पहुंचने के लिए आरोहित किया है। जब आप डॉकर कंटेनर चला रहे हों, तो वह कंटेनर प्रारंभ में root के रूप में चल रहा है।

आप FUSE फाइल सिस्टम को माउंट करते समय allow_root या allow_other माउंट विकल्प का उपयोग कर सकते हैं। उदाहरण के लिए:

$ encfs -o allow_root /encrypted /other 

यहाँ, allow_root, माउंटप्वाइंट के लिए acces है के लिए रूट उपयोगकर्ता की अनुमति है, जबकि allow_other माउंटप्वाइंट (बशर्ते कि निर्देशिका यूनिक्स पर अनुमतियाँ उन्हें उपयोग की अनुमति) का उपयोग करने की किसी को भी अनुमति देगा होगा।

अगर मैं encfs द्वारा रचित निर्माण allow_root का उपयोग कर filesytem, ​​मैं तो एक डोकर मात्रा और कि फाइल सिस्टम की सामग्री के रूप में है कि फाइल सिस्टम को बेनकाब कर सकते हैं कंटेनर के अंदर से सही ढंग से दिखाई दे रहे हैं।

+4

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

+2

यह संभव है कि आप http://blog.oddbit.com/2015/01/18/docker-vs-privatetmp/ पर मार रहे हों – larsks

4

यह निश्चित रूप से है क्योंकि आपने माउंटपॉइंट पर चढ़ने से पहले डॉकर डिमन शुरू किया था।इस मामले में निर्देशिका नाम के लिए inode अभी भी मेजबान स्थानीय डिस्क पर इंगित किया जाता है:

/usr/local/bin/s3fs -o rw -o allow_other -o iam_role=ecsInstanceRole /mounts/s3-data-mnt 
ls -i 
1 s3-data-mnt 

मेरा अनुमान है कि डोकर कुछ करता है:

ls -i /mounts/ 
1048579 s3-data-mnt 

फिर अगर आप s3fs की तरह एक फ्यूज डेमॉन का उपयोग कर माउंट निर्देशिका नामों के बूटस्ट्रैप कैशिंग इनोड्स में (कोई भी जिसके पास इस रिक्त स्थान को भरने से अधिक जानकारी हो सकती है)।

आपकी टिप्पणी सही है। अगर आप माउंटिंग समाप्त होने के बाद बस डॉकर को पुनरारंभ करते हैं तो आपकी वॉल्यूम मेजबान से आपके कंटेनर में सही ढंग से साझा की जाएगी। (या आप अपने सभी माउंट्स को बढ़ने के बाद तक डॉकर शुरू करने में देरी कर सकते हैं)

दिलचस्प क्या है (लेकिन अब से मुझे पूरा करता है) यह है कि कंटेनर से बाहर निकलने और मेजबान पर माउंटपॉइंट को अन-माउंट करने पर साझा मात्रा जादुई दिखाई दिया करने के लिए कंटेनर के भीतर से मेरे लेखन (वे मेजबान मशीनों स्थानीय डिस्क पर आईनोड में संगृहीत किए जा रहे थे):

[[email protected] s3-data-mnt]# echo foo > bar 
[[email protected] s3-data-mnt]# ls /mounts/s3-data-mnt 
total 6 
1 drwxrwxrwx 1 root root 0 Jan 1 1970 . 
4 dr-xr-xr-x 28 root root 4096 Sep 16 17:06 .. 
1 -rw-r--r-- 1 root root 4 Sep 16 17:11 bar 
[[email protected] s3-data-mnt]# docker run -ti -v /mounts/s3-data-mnt:/s3-data busybox /bin/bash 
[email protected]:/mounts/s3-data# ls -als 
total 8 
4 drwxr-xr-x 3 root root 4096 Sep 16 16:05 . 
4 drwxr-xr-x 12 root root 4096 Sep 16 16:45 .. 
[email protected]:/s3-data# echo baz > beef 
[email protected]:/s3-data# ls -als 
total 9 
4 drwxr-xr-x 3 root root 4096 Sep 16 16:05 . 
4 drwxr-xr-x 12 root root 4096 Sep 16 16:45 .. 
1 -rw-r--r-- 1 root root 4 Sep 16 17:11 beef 
[email protected]:/s3-data# exit 
exit 
[[email protected] s3-data-mnt]# ls /mounts/s3-data-mnt 
total 6 
1 drwxrwxrwx 1 root root 0 Jan 1 1970 . 
4 dr-xr-xr-x 28 root root 4096 Sep 16 17:06 .. 
1 -rw-r--r-- 1 root root 4 Sep 16 17:11 bar 
[[email protected] /]# umount -l s3-data-mnt 
[[email protected] /]# ls -als 
[[email protected] /]# ls -als /s3-stn-jira-data-mnt/ 
total 8 
4 drwxr-xr-x 2 root root 4096 Sep 16 17:28 . 
4 dr-xr-xr-x 28 root root 4096 Sep 16 17:06 .. 
1 -rw-r--r-- 1 root root 4 Sep 16 17:11 bar 
1

आप nsenter में माउंट कॉल लपेटकर इस पर काम करने के लिए सक्षम हो सकता है इसे उसी लिनक्स माउंट नेमस्पेस में डॉकर डिमन के रूप में माउंट करने के लिए, उदाहरण के लिए।

nsenter -t "$PID_OF_DOCKER_DAEMON" encfs ... 

सवाल यह है कि इस दृष्टिकोण से ही पुनः आरंभ एक डेमॉन बच जाएगा है। ;-)

संबंधित मुद्दे