Доступ к виртуальным 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 с последовательными портами.