#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.