Служба Windows завершает работу сразу после запуска в Docker-контейнере

У меня есть служба Windows, написанная в C# что наследует от ServiceBase, Я попытался установить службу в контейнере (а также запустить как консольное приложение), но он отключается через несколько секунд в режиме демона. Если я буду запускать это интерактивно (-it) тогда он продолжает работать. OnStop вызывается, но я не могу определить, что вызывает его в режиме демона.

Я бежал с ping, чтобы сохранить контейнер:

docker run -d --name myapptest myapp ping -t localhost

файл докера:

FROM microsoft/dotnet-framework
SHELL ["powershell.exe", "-Command", "$ErrorActionPreference = 'Stop'; 
$ProgressPreference = 'Continue'; $verbosePreference='Continue';"]

RUN net user /add appuser Password1234!
RUN net localgroup administrators appuser /add

RUN New-Item -Path "C:/app" -ItemType directory

WORKDIR /app

COPY ".\hostcode" "C:\app"

RUN "C:/Windows/Microsoft.NET/Framework64/v4.0.30319/InstallUtil.exe" 
/username=.\appuser /password=Password1234! /LogToConsole=true /ShowCallStack myapp.exe
RUN SC.exe config MyApp start=auto

CMD POWERSHELL Write-Host Starting container... ; \
while ($true) { Start-Sleep -Seconds 3600 }

1 ответ

Я думаю, что у вас может быть недопонимание RUN, CMD, а также ENTRYPOINT,
Эта статья объясняет это хорошо, так что проверьте это.

Попробуйте изменить файл Docker:

от

RUN SC.exe config MyApp start=auto

CMD POWERSHELL Write-Host Starting container... ; \
while ($true) { Start-Sleep -Seconds 3600 }

в

ENTRYPOINT POWERSHELL Write-Host Starting container... && \
           SC.exe config MyApp start=auto

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

Другие вопросы по тегам