Windows Server 2016 TP5 (ゲスト vm) を搭載した Win7 (ホスト) および Virtual Box で実行されます。WS2016 では、コンテナーの windowsservercore ベース イメージを使用して docker を実行します。
私はフリート管理システムのようなものを試しています。そこでは、複数のシミュレートされた車両を個別のドッカー イメージ内で起動しようとしています。
これらの車両シミュレーターは、シミュレートされた車両が読み取る仮想 COM ポートにデータを送信するシミュレートされた GPS を使用します。
Windows XP/7/Server 2016 では、仮想 COM ポートを作成するためにcom0com(2.2.2.0 署名済み)を使用することに成功しました。
私の問題は、docker コンテナー内にインストールされた仮想 com ポートを取得することです。代わりに、ホスト上のデバイスとしてそれらにアクセスします。
私の最初の試みは、docker 内で com0com を実行することでした。ドライバのインストールはサイレント モードを使用して正常に動作しますが、インストールされたアプリケーションを使用して仮想 com ポート ペアを作成すると、問題が発生します。コマンドが停止し、アプリケーション イベント ログを表示すると、コマンドを実行しようとするたびに、この種の行がいくつか表示されます。
<date> <time> Information Windows Error Rep. .. 1001 Fault bucket , type 0
代わりにホストでデバイスを作成しようとして、代わりにデバイスを渡すと、それらにアクセスできないようです
コンテナ内でcom0com --listを使用すると、デバイスは表示されますが、ホストと同じ名前ではありません
関連付けられた Dockerfile で、com0com setupc.exeを使用して名前を変更し、ホストで識別される名前と同じ名前にします。
ホストで発行されたモードコマンドは、ポートを適切に一覧表示します。一方、コンテナー内からのモード コマンドを使用すると、一覧表示に失敗し、次の 1 つの項目のみが表示されます: CON
次に、--device=//./COM128://./COM128引数を使用して docker run に渡そうとしました
注!:これはデバイスへの正しい「パス」ですか?
これの注目すべき結果はゼロです。com0com setupcコマンドは、モードと同じ、同じ結果を返します。
奇妙なことに、powershell を実行してシリアルポートを一覧表示すると、正しい名前でホスト上で利用可能な期待されるコンポートが取得されますが、それらの 1 つを開こうとすると例外が発生します。
PS C:\sims\com0com> [System.IO.Ports.SerialPort]::getportnames()
COM128
COM129
PS C:\sims\com0com> $comports=[System.IO.Ports.SerialPort]::getportnames()
PS C:\sims\com0com> $port= new-Object System.IO.Ports.SerialPort $comports[0],9600,None,8,one
PS C:\sims\com0com> $port.open()
Exception calling "Open" with "0" argument(s): "The port 'COM128' does not exist."
最後に、上記とほぼ同じことを試みましたが、別の仮想comポートソフトウェア(eltima)を使用してホストに設定し、コンテナでpsを使用してポートを開こうとしたときの最終結果は、com0comで構成されたポートの場合と同じです
アップデート:
com0comドライバーをhyper-vコンテナーにインストールでき、それらを共有しようとする必要がないという論文を考慮して、-isolationフラグを使用してdocker runを実行し、代わりにhyper-vでコンテナーを実行する新しいアプローチを試しましたホストから。
hyper-v で実行すると、windowsservercore ベース イメージの代わりに nanoserver ベース イメージを実行するように変更する必要がありました。
現在、インストーラー (NSIS ベース) は 32 ビット アプリケーションであり、nanoserver は 64 ビット アプリケーションしか実行できないため、nanoserver で com0com インストール ツールを実行できないという問題が発生しています。
一目見ただけで、NSIS の新しいバージョン (3.0) を com0com リポジトリに含まれる NSIS スクリプトと一緒に使用できることがわかります。
前進する方法に関するすべてのアイデアは大歓迎です!
PS: msdn コンテナー フォーラムに投稿された同じ質問