2015-12-16 14 views
14

के साथ डिवाइस (वेबकैम, यूएसबी ड्राइव, आदि) साझा करना मुझे अपने डॉकर कंटेनर के साथ मेरे होस्ट लिनक्स मशीन पर /dev से विशिष्ट डिवाइस साझा करने की आवश्यकता है। उस समय docker run में मौजूद हैं /dev में किसी भी उपकरणों को बांटने के लिएडॉकर

--privileged झंडा काम करता है कहा जाता है, लेकिन किसी भी बाद में जोड़े गए या निकाले उपकरणों कंटेनर में प्रचार नहीं करते।

मैंने docker run -v=/dev:/dev ... की कोशिश की लेकिन यह/dev/pts जैसी फ़ाइलों की अनुमतियों और स्वामित्व के साथ खराब हो गया, जिससे होस्ट मशीन को नए psuedo-टर्मिनल बनाने में सक्षम नहीं किया गया।

मैंने --device ध्वज भी आजमाया, लेकिन यह आपको उस डिवाइस को साझा करने की अनुमति नहीं देता है जो अभी तक मौजूद नहीं है।

अंत में, मैं -v=/dev/video0:/dev/video0 जैसे उपकरणों के लिए संस्करणों को बांटने लेकिन अगर/dev/video0 दिखाए जाने से पहले मौजूद नहीं है, डोकर वहाँ एक निर्देशिका बनाता है और एक वेब कैमरा जब में खामियों को दूर नहीं ले/dev/video0 होगा की कोशिश की।

क्या इस समर्थित कार्यक्षमता को पाने का कोई बेहतर तरीका है?

उत्तर

6

आप देख रहे झंडा --device

--device=[] 
     Add a host device to the container (e.g. --device=/dev/sdc:/dev/xvdc:rwm) 

आपका दिन शुभ हो जाँच!

+0

--device ध्वज के साथ समस्या यह है कि डिवाइस विफल होने पर यह विफल हो जाता है। मेरे पास एक बहुत ही जटिल सेटअप है जहां 4 यूएसबी वेबकैम और 4 एसडी कार्ड नियमित रूप से सर्वर से प्लग/अनप्लग किए जाते हैं, और कुछ डॉकर ऐप्स वेबकैम से कनेक्ट होते हैं और कार्ड को डेटा सहेजते हैं। – Ryan

+0

ओह, मैं देखता हूं। यह वास्तव में बहुत जटिल है और मुझे यकीन नहीं है कि डॉकर ने अभी तक इस तरह की स्थितियों को मंजूरी दे दी है। एकमात्र सलाह जो मैं आपको दे सकता हूं, अगर इसे संभव हो तो इसे सरल बनाना होगा, लेकिन यह आपकी अन्य बाधाओं के अनुरूप नहीं हो सकता है। – Auzias

7

मुझे लगता है कि सिद्धांत में यह --privileged ध्वज का उपयोग करके निश्चित रूप से संभव है, क्योंकि यह बात आपको सभी होस्ट उपकरणों तक पहुंचने की क्षमता देती है। यदि आप usbutils या इसी तरह स्थापित करते हैं (आपकी छवियों के वितरण के आधार पर) आप देखेंगे कि विशेषाधिकार प्राप्त कंटेनर lsusb चलाते समय हॉटप्लग किए गए डिवाइस को देखने में सक्षम है। दुर्भाग्यवश हालांकि वे/dev के अंतर्गत दिखाई नहीं देते हैं। उन वर्णनकर्ताओं के निर्माण को स्क्रिप्ट करना और उन्हें अपने सॉफ्टवेयर द्वारा/dev के तहत सही ढंग से संभाला जाना दुर्भाग्यवश शामिल हो सकता है। यद्यपि यह आपके उपकरणों के लिए ऐसा नहीं होना चाहिए।

आप पहले प्रयास के रूप में क्या कर सकते हैं केवल उन्हें mknod का उपयोग करके बनाना है। मैं यह मेरा एचटीसी फोन के साथ बाहर की कोशिश की और यह एक तरह से काम किया है (प्रासंगिक यहाँ नहीं विवरण), बस lsusb में hotplugged डिवाइस के लिए लाइन की जाँच करें:

Bus 003 Device 002: ID 0bb4:0f25 HTC (High Tech Computer Corp.) One M8 

वर्णनकर्ता के लिए सही फ़ोल्डर पर जाएँ:

cd /dev/bus/usb/003 

जांच अपने कर्नेल में USB ड्राइवर मौजूदा वर्णनकर्ताओं के लिए मुख्य संस्करण:

[email protected]:/dev/bus/usb/003# ls -la 
total 0 
drwxr-xr-x 2 root root  160 Dec 26 13:40 . 
drwxr-xr-x 6 root root  120 Dec 26 13:30 .. 
crw-rw-r-- 1 root root 189, 256 Dec 26 13:30 001 
crw-rw-r-- 1 root root 189, 258 Dec 26 13:30 003 
crw-rw-r-- 1 root root 189, 259 Dec 26 13:30 004 
crw-rw-r-- 1 root root 189, 260 Dec 26 13:30 005 
crw-rw-r-- 1 root root 189, 261 Dec 26 13:30 006 

=> 189 :) => मंजूरी बना सकते हैं और कर रही है, जबकि इसलिए लघु संस्करण 0.

mknod 002 c 189 0 

=> कम से कम lsusb -v अब डिवाइस खोलने में सक्षम है का उपयोग करें। कुछ अपवादों के साथ, अधिकांश हार्डवेयर आईएमओ के लिए भी काम करना चाहिए।

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

होस्ट पर हॉटप्लग/dev/video0 कहें, आप उस नए कंटेनर को स्पिन कर सकते हैं जिसने इस डिवाइस को उस ईवेंट में आरोहित किया है। इस कंटेनर (कि socat इंस्टॉल किया होगा) पड़ सकते है:

socat tcp-l:54321,reuseaddr,fork file:/dev/video0,nonblock,waitlock=/var/run/video0.lock 

इस बात मानते हुए होस्ट नाम video0-सर्वर है अब आप के माध्यम से ग्राहक पर video0 के लिए वर्णनकर्ता बना सकते हैं:

socat pty,link=/dev/video0,waitslave tcp:video0-server:54321 

अब आप चाहिए डिवाइस का उपयोग ठीक करने में सक्षम हो। कई उपकरणों के लिए सोशल ओवरहेड मुझे लगता है कि एक मुद्दा नहीं होना चाहिए। यदि नेटवर्किंग के माध्यम से आपके मुख्य कंटेनर के साथ गतिशील रूप से संवाद करने वाले कई कंटेनर के माध्यम से यह स्क्रिप्टिंग एक विकल्प है और ओवरहेड द्वारा किसी भी सार्थक तरीके से प्रदर्शन प्रभावित नहीं होता है, तो दूसरा विकल्प मेरी राय में --privileged मोड से क्लीनर और सुरक्षित है।

+0

बहुत बढ़िया - मुझे यह कोशिश करनी होगी! बहुत आशाजनक लगता है। – Ryan

+0

क्यों न केवल '--device' ध्वज का उपयोग करें? – Auzias

+1

@Auzias क्योंकि व्यक्ति ने ऐसे समाधान के लिए कहा है जो डिवाइस को पहले से चलने वाले कंटेनर में प्लग करने की अनुमति देगा। '--device' इस परिदृश्य में आपकी सहायता नहीं करेगा :) –

0

सिस्टम चालू होने पर डिवाइस को रखना मुश्किल है (यूएसबी डिटेक्शन) आपको डिवाइस को रखने के लिए एक स्क्रिप्ट बनाना चाहिए क्योंकि वे पाए जाते हैं और --rm (इसलिए जब भी आप मशीन से बाहर निकलते हैं, और आपके पास डिवाइस आयात करने का एक नया मौका है)