2015-12-16 73 views
14

私のホストLinuxマシン上の/devから特定のデバイスをドッカーコンテナで共有する必要があります。Dockerでデバイス(ウェブカメラ、USBドライブなど)を共有する

/devのデバイスは、docker runが呼び出されたときに存在するデバイスを共有するために使用されますが、後で追加または削除されたデバイスはコンテナに伝播しません。

私はdocker run -v=/dev:/dev ...を試しましたが、それは/ dev/ptsのようなファイルのパーミッションと所有権に悩まされ、新しい擬似端末を作成できないようにしました。

また、--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つのUSBウェブカメラと4つのSDカードが定期的にサーバーからプラグ/プラグが抜かれ、いくつかのDockerアプリケーションがウェブカメラに接続し、データをカードに保存している非常に複雑なセットアップをしています。 – Ryan

+0

ああ、そうだ。それは確かにかなり複雑で、私はDockerがこのような状況をまだ明らかにしているのかどうかはわかりません。 私があなたに与えることができる唯一のアドバイスは、それが可能であれば単純化することですが、あなたの他の制約に適合しないかもしれません。 – Auzias

7

私は理論的には--privilegedフラグを使用してこれが可能であると思います。このことは、すべてのホストデバイスにアクセスできるようにするためです。 usbutilsまたはそれに類するもの(Image Distributionに依存します)をインストールすると、lsusbを実行している特権を持つコンテナがホットプラグされたデバイスを見ることができます。 残念ながら、/ devの下に表示されません。これらの記述子の作成をスクリプト化し、/ devのもとであなたのソフトウェアによって適切に処理されるようにすることは、残念なことに公正に関与することになります。それはあなたのデバイスのためにその方法である必要はありません。

最初の試みとして、mknodを使用して作成することができます。

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

は記述のための正しいフォルダに移動します:、単にlsusbがでホットプラグデバイスのためのラインをチェック は、私は私のHTCの携帯電話でこれを試してみた、それは一種の(ここでは関係ありません詳細は)働いた

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を使用今デバイスを開くことが可能です。いくつかの例外を除けば、ほとんどのハードウェアで同じように動作するはずです。

Dockerとコンテナ化の精神の中で、おそらく低速ですが確かに安全ですが、ホット・マウント時にコンテナを使用してデバイスをアクセスし、デバイスをメイン・コンテナと共有する方法tcp経由でsocat tty経由であなたのビデオアプリを走らせる。

ホストで/ dev/video0をホットプラグすると、そのデバイスがそのイベントにマウントされている新しいコンテナをスピンアップできます。このコンテナは、(それがsocatに関するインストールされている)を実行できます。今すぐ

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

あなたがする必要があります。この事を想定し

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

あなたが今を介してクライアントにvideo0の記述子を作成することができ、ホスト名video0-サーバーを持っていますデバイスをうまく使うことができます。多くのデバイスでは、socatオーバーヘッドは私が考えるべき問題ではありません。 ネットワークを介してメインコンテナと動的に通信する複数のコンテナを介してスクリプトを作成することはオプションであり、オーバーヘッドによってパフォーマンスに有意な影響はありません。後者のオプションは、私の意見では--privilegedモードよりもきれいで安全です。

+0

素晴らしい - 私はこれを試してみる必要があります!非常に有望ですね。 – Ryan

+0

代わりに '--device'フラグを使うのはなぜですか? – Auzias

+1

@Auziasは、既に実行中のコンテナにデバイスを差し込むことを許可するソリューションを依頼したためです。 '--device'はこのシナリオであなたを助けません:) –

0

システムが動作しているとき(USB検出)にデバイスを配置することは困難です。見つかったときにデバイスを配置し、--rmを実行するスクリプトを作成する必要があります。そのため、

関連する問題