Разница между установкой службы в контейнере Windows и Windows Server 2016?

#docker #service #windows-server-2016

#docker #Обслуживание #windows-server-2016

Вопрос:

У меня есть приложение-служба, которое будет правильно установлено в Windows Server 2016 Standard с помощью следующей команды:

 PS C:Service> c:\mysvc\mysvc.exe -install
Service installed successfully
  

Если я запускаю то же самое, когда в Dockerfile с помощью:

 RUN c:\mysvc\mysvc.exe -install
  

Я получаю следующий вывод:

Команда ‘cmd /S /C c:svcmysvc.exe -install’ вернул ненулевой код: 3221225781

Я не уверен, почему он ведет себя по-другому, или где я мог бы проверить, чтобы получить лучшие идеи относительно причины ошибки.

Ответ №1:

Полезный совет для устранения такого рода проблем заключается в том, чтобы запустить базовый образ в интерактивном контейнере, следуйте инструкциям для вашего Dockerfile и посмотрите, получите ли вы более полезный результат.

В вашем случае что-то вроде:

 docker run -it --name temp microsoft/windowsservercore cmd
  

Затем в другой команде на хосте Windows:

 docker cp mysvc.exe temp:c:/mysvc.exe
  

И обратно в интерактивный запуск контейнера c:mysvc -install .

Если вывод не помогает, вы могли бы добавить некоторые дополнительные сведения к вашему вопросу здесь — файл Dockerfile и некоторую информацию о службе Windows.

Комментарии:

1. Я попробовал, как вы предложили, и когда я запускаю c:mysvc.exe -команда install просто возвращает, вывода нет, запущенный процесс не создан, служба не создана, сообщений об ошибках нет, ничего. Это странно.

2. Хорошо — какой у вас FROM образ? И есть ли в exe какие-либо переключатели для подробной установки?

3. Лучше всего предположить, что у вашей службы есть какая-то зависимость, которой нет или которая не включена в базовом образе ядра сервера, но если вы не сможете получить больше информации из exe, это будет трудно выяснить.

4. Я действительно разобрался, по крайней мере, с частью проблемы. Похоже, что, среди прочего, Server Core 2016 не имеет следующих DLL: opengl32.dll , oledlg.dll , glu32.dll и ddraw.dll , тогда как стандарт Server 2016 делает. Копирование этих DLL-файлов с Server 2016 standard на мою серверную виртуальную машину Core позволяет мне установить службу. Я не видел сообщения об ошибке в моем контейнере Server Core, потому что на самом деле появляется диалоговое окно с сообщением о том, что он не может их найти, что контейнер, похоже, не поддерживает.

5. Хм. Все они звучат как компоненты пользовательского интерфейса, поэтому я бы задался вопросом, почему они зависят от службы Windows. Также — не уверен в последствиях лицензирования копирования DLL.