Можно ли запустить Kinect V2 внутри контейнера Docker?
Я изучаю возможность запуска программы визуальных жестов C# Kinect (что-то вроде проекта Continuous Gesture Basics https://github.com/angelaHillier/ContinuousGestureBasics-WPF) Внутри Docker для контейнера Windows.
возможно ли это даже теоретически (запустить C# Kinect в контейнере Docker для Windows?)
если ответ на 1-Да, вот некоторые дополнительные подробности:
Я использую microsoft / dotnet-framework: 4.7 image в качестве основы, и мой первоначальный файл Dockerfile выглядит так:
FROM microsoft/dotnet-framework:4.7
ADD . /home/gesture
WORKDIR /home/gesture
построить изображения:
$ docker build -t kinect .
включить контейнера:
$ docker run -dit --name kinectContainer kinect
прикрепить к сеансу powershell, чтобы обезьяна вокруг:
$ docker exec -it kinectContainer powershell
когда я пытаюсь запустить приложение жестов из контейнера Docker, я получаю следующую ошибку (которая ожидается, так как не был установлен Kinect SDK в контейнере):
Unhandled Exception: System.BadImageFormatException: Could not load file or assembly 'Microsoft.Kinect, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependenc
ies. Reference assemblies should not be loaded for execution. They can only be loaded in the Reflection-only loader context. (Exception from HRESULT: 0x80131058) ---> System.BadImageFormatExcep
tion: Cannot load a reference assembly for execution. erable program. Check the spelling of the name, or if a path was included, verify that the path
--- End of inner exception stack trace ---
at GestureDetector.GestureDetectorApp..ctor()
на данный момент, большой вопрос, Как установить Kinect V2 SDK [KinectSDK-v2.0_1409-настройка.exe] или во время выполнения и Kinect v2 для [KinectRuntime-В2.0_1409-установки.exe] в контейнере.
установщики имеют EULA и согласно какой-то умный Университет Висконсина, есть техника для извлечения установщиков с помощью wix's dark.исполняемый decompiler(https://social.msdn.microsoft.com/Forums/en-US/a5b04520-e437-48e3-ba22-e2cdb46b4d62/silent-install-installation-instructions?forum=kinectsdk)
ex.
$ & 'C:Program Files (x86)WiX Toolset v3.11bindark.exe' C:installerworkKinectRuntime-v2.0_1409-Setup.exe -x c:installerworkkinect_sdk_installersfiles
проблема, с которой я столкнулся, когда я добрался до базовых файлов msi, нет возможности запускать их молча, используя msiexec.
я выяснил, что установщик времени выполнения (установщик времени выполнения (KinectRuntime-x64.msi), извлеченный из Kinect V2 SDK), делает по крайней мере следующие изменения в файловой системе:
создает папку "Kinect" в C:WindowsSystem32 и добавляет 3 файла в систему 32:
k4wcll.dll файлы
kinect20.dll файлы
microsoft._kinect.dll файлы
последние три файла в System32 должны быть 64-разрядными версиями (установщик, похоже, имеет x86 и x64 версии этих 3)
репликация этих изменений вручную не приводит к успеху на главной машине, не говоря уже о контейнер.
в настоящее время неясно, какие другие изменения реестра / системы происходят с установщиком (и приведет ли это нас к линии цели в контейнере Docker)
есть идеи о том, как действовать отсюда?
2 ответов
короче нет. docker в windows не имеет возможности аппаратного туннеля / карты. в Linux это происходит через --device=
опции
поскольку @VonC заявил, что вам нужно будет использовать виртуальную машину Windows, это может быть Hyper-V или вы можете использовать виртуальное поле, тогда вы можете предоставить оборудование Kinect с помощью метода туннелирования (добавить/подключить устройство), без этого для вашего контейнера не будет возможности получить доступ к оборудованию хост-машины с windows.
другим подходом было бы попытаться установить Kinetic в виртуальной машине Windows server и обнаружить точные изменения, вызванные указанной установкой.
см., например,"как я могу узнать, какие изменения делает установщик программы?" и такой инструмент, как ZSoft Специально Деинсталлятор 2.5.
после того, как вы точно определили, какие файлы/реестр/переменные влияют на процесс установки, вы можете реплицировать это в Dockerfile.