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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Обновить:

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

Запуск в hyper-v заставил нас перейти на запуск базового образа наносервера вместо базового образа windowsservercore.

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

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

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

PS: тот же вопрос размещен на форуме MSDN контейнеры

1 ответ

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

Другие вопросы по тегам