Приложение C # завершается с ошибкой «не удается запустить службу из командной строки» в докере, но не на хосте - PullRequest
0 голосов
/ 04 июня 2019

У нас есть собственное приложение на C # .NET, которое мы пытаемся поместить в контейнеры Windows. Изначально приложение было разработано для работы в качестве службы, но кажется, что контейнеры лучше запускать как процесс. Поэтому разработчики внесли небольшие изменения, и теперь мы можем запустить приложение из командной строки. Он успешно работает на Win 10, 2012 R2, 2016 и 2019.

Однако при попытке запустить точно такое же приложение в контейнере 2016 или 2019 года мы получаем сообщение об ошибке:

Невозможно запустить службу из командной строки или отладчика. Сначала необходимо установить службу Windows (с помощью installutil.exe), а затем запустить ее с помощью ServerExplorer, средства администрирования служб Windows или команды NET START.

Почему запуск в контейнере изменит способ запуска приложения? Для приложения не существует зависимостей (кроме .NET), которые не включены в приложение.

Я могу успешно установить приложение в качестве службы в контейнере и запустить службу без ошибок. Однако попытка свернуться http://localhost в контейнере или вне контейнера завершается неудачей, даже если порт открыт через опцию -p 80:80 из запуска Docker.

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

1 Ответ

0 голосов
/ 12 июня 2019

Оказывается, в коде был оператор if на Environment.UserInteractive, который сообщал ему, вести себя ли как консоль или как служба. В контейнерах Windows Docker Environment.UserInteractive всегда по ложному срабатыванию по какой-то причине вынуждает приложение работать даже при запуске в качестве консоли. Мы использовали переменную окружения, чтобы переопределить if.

Стоит отметить, что, очевидно, в .NET Core переменная всегда срабатывает как true, что может быть полезно, учитывая способ запуска приложений Linux.

...