Запуск на 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