Служба Windows на докере не запускается

Я создал приложение службы C # WCF для Windows в VS 2017 и добавил поддержку Docker.

Был создан следующий Dockerfile:

FROM microsoft/dotnet-framework:4.7.1-windowsservercore-1709
ARG source
WORKDIR /app
COPY ${source:-obj/Docker/publish} .
ENTRYPOINT ["C:\\WcfService.exe"]

Когда я создаю его с помощью docker-compose в VS, я получаю сообщение об ошибке:

Невозможно запустить службу из командной строки или отладчика. Сначала необходимо установить службу Windows (с помощью installutil.exe), а затем запустить ее с помощью ServerExplorer, инструмента администрирования служб Windows или команды NET START. Программа «[2172] WcfService.exe» завершилась с кодом 0 (0x0).

Я открыл PowerShell и набрал docker ps - контейнер запущен. Итак, я использовал команду New-Service и создал «TestService». Когда я использую Get-Service для просмотра всех служб, я вижу их в списке в режиме «Остановлено». Когда я использую Start-Service TestService, я получаю следующую ошибку:

Start-Service: не удалось запустить службу TestService (TestService). В строке: 1 символ: 1 + Start-Service TestService + ~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo: OpenError: (System.ServiceProcess.ServiceController: ServiceController) [Start-Service], ServiceCommandException + FullyQualifiedErrorId: StartServiceFailed, Microsoft.PowerShell.Commands.StartServiceCommand

Пытался найти информацию, но ничего не работает. Любые идеи?


person Idan Levi    schedule 31.05.2018    source источник
comment
Ваша служба на самом деле называется TestService или WcfService? При запуске служба регистрируется в контроллере службы под определенным именем и запускается только при вызове с использованием этого имени. Вы не можете зарегистрировать исполняемый файл под произвольным именем службы, это должно быть именно то имя службы, которое он использует. (Однако имя исполняемого файла не имеет значения.)   -  person Jeroen Mostert    schedule 31.05.2018
comment
В вашем файле докеров не указана установка и, следовательно, сообщение об ошибке во время запуска. Таким образом, вам нужно использовать шаг installutil и т. Д. До точки входа. Кроме того, ваша точка входа также не должна быть исполняемым файлом вашей службы.   -  person Gregory Suvalian    schedule 31.05.2018
comment
@JeroenMostert Без контейнеров мне удалось запустить службу под тем же именем на моем компьютере с Windows 10. Я попытался определить службу с именем службы, в которой она инициализируется (this.ServiceName = WcfService1;), но все равно получаю ту же ошибку.   -  person Idan Levi    schedule 31.05.2018
comment
@GregorySuvalian Я не мог понять, как и когда использовать installutil. А по поводу точки входа .. что можно вместо этого использовать?   -  person Idan Levi    schedule 31.05.2018
comment
Вы можете копнуть немного глубже и проверить журнал событий (Get-EventLog -LogName System -Newest 10 -Source "Service Control Manager" | Select *, загляните в Application, если служба что-то записала в журнал), чтобы узнать, в чем на самом деле ошибка. Тайм-аут предполагает конфликт имен, но это может быть что-то еще.   -  person Jeroen Mostert    schedule 31.05.2018
comment
Установите Windows Server Core 1709 как виртуальную машину. Выполните все необходимые команды с консоли на этой виртуальной машине, чтобы ваша служба работала. Затем продублируйте эти команды в DOCKERFILE. Вам нужно заменить ENTRYPOINT чем-то другим, кроме исполняемого файла вашей службы. Например, используйте servicemonitor исполняемый файл из образа IIS. ВХОДНАЯ ТОЧКА [C: \\ ServiceMonitor.exe, w3svc]. Замените w3svc своим именем службы   -  person Gregory Suvalian    schedule 31.05.2018
comment
@JeroenMostert, ваш комментарий помог мне получить нужный мне ответ, но я не могу принять этот комментарий в качестве ответа. Спасибо!   -  person Idan Levi    schedule 03.06.2018


Ответы (1)


Итак, я последовал совету Джеруна и стал копать глубже, чтобы увидеть программу просмотра событий. Я использовал несколько фильтров в команде Get-EventLog, чтобы получить соответствующую строку с ошибкой, и сохранил ее в переменной.

$A = Get-EventLog -LogName System -Newest 10 -Source "Service Control Manager" | Select *

Затем я красиво отформатировал его, используя что-то вроде:

$A | Format-List -Property *

и получил исключение.

По-видимому, это как-то связано с библиотекой C ++, которую использует мое приложение. Он может отсутствовать или в среде возникли проблемы с его запуском, но это еще одна проблема, которую, я считаю, я могу решить.

Надеюсь, что это поможет другим столкнуться с подобными проблемами. Спасибо.

person Idan Levi    schedule 03.06.2018