Доступ к виртуальным ком-портам внутри док-контейнера WS2016

Запуск на Win7 (хост) и Virtual Box с Windows Server 2016 TP5 (гостевая виртуальная машина). На WS2016 я запускаю докер, используя базовый образ windowsservercore для контейнеров.

Я пробую систему управления автопарком, в которой я пытаюсь запустить несколько смоделированных автомобилей внутри отдельных образов докеров.

В этих симуляторах транспортных средств используется смоделированный GPS, который отправляет данные на виртуальный коммуникационный порт, откуда считываются смоделированные транспортные средства.

В Windows XP/7/Server 2016 я успешно использовал com0com(2.2.2.0 signed) для создания виртуальных COM-портов.

Моя проблема заключается в том, чтобы установить виртуальные порты com внутри контейнера докеров, альтернативно обращаясь к ним как к устройствам на хосте.

Моя первая попытка заключалась в запуске com0com внутри докера, установка драйверов работает нормально в автоматическом режиме, но при создании пар виртуальных портов com с помощью установленного приложения я сталкиваюсь с проблемами. Команда останавливается, и если я просматриваю журнал событий приложения, я вижу несколько строк такого типа каждый раз, когда я пытаюсь запустить команду.

<date> <time> Information Windows Error Rep. .. 1001 Fault bucket , type 0 

Вместо того, чтобы пытаться создать устройства на хосте и вместо этого передавать устройства, я, похоже, не могу получить к ним доступ.

Используя com0com --list в контейнере, я вижу устройства, но не с тем же именем, что и на хосте.

В связанном Dockerfile я переименовываю их с помощью com0com setupc.exe в то же имя, которое указано на хосте.

Команда mode, выданная на хосте, правильно перечисляет порты, с другой стороны, используя команду режима из insde, контейнер не может их перечислить, показывая только один элемент: CON

Затем я попытался передать их, используя аргумент --device=//./COM128://./COM128 для запуска докера.

ПРИМЕЧАНИЕ! Является ли это правильным "путем" к устройствам?

Заметный результат равен нулю, команда com0com setupc дает тот же результат, то же самое с режимом

Странно то, что когда я запускаю powershell и перечисляю последовательные порты, я получаю ожидаемые comports как доступные на хосте с правильными именами, но попытка открыть один из них дает исключение

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."

Наконец, попробовал примерно то же самое, что и выше, но с другим программным обеспечением виртуального ком-порта (eltima), настроив их на хосте, окончательный результат при попытке открыть порт с помощью ps в контейнере такой же, как и для настроенных портов com0com.

Обновление:

Попробовал новый подход, вместо этого запустив контейнер в Hyper-V, используя флаг -isolation для запуска докера, учитывая тезис о том, что вы сможете установить драйверы com0com в контейнере Hyper-V, не пытаясь поделиться ими. от хозяина.

Запуск в Hyper-V вынудил нас переключиться на запуск базового образа nanoserver вместо базового образа windowsservercore.

В настоящее время застрял на невозможности запустить инструмент установки com0com в наносервере, поскольку установщик (на основе NSIS) является 32-битным приложением, а наносервер может запускать только 64-битные приложения.

Беглый взгляд показывает, что новую версию (3.0) NSIS можно использовать вместе со сценариями NSIS, включенными в репозиторий com0com.

Все идеи о том, как двигаться вперед, приветствуются!

PS: тот же вопрос опубликовано на форуме контейнеров msdn


person Kristofer    schedule 27.09.2016    source источник


Ответы (1)


Изменен на использование именованных каналов, чтобы заставить его работать, поскольку никто больше не использует докер для окон с последовательными портами.

person Kristofer    schedule 25.10.2016