c# - Windows服务在Docker容器中启动后立即关闭

标签 c# docker windows-services docker-for-windows docker-desktop

我有一个用C#编写的Windows服务,该服务继承自ServiceBase
我尝试将服务安装在容器中(并且也作为控制台应用程序运行),但是在守护程序模式下几秒钟后它将关闭。如果我间歇性地运行它(-it),那么它将保持运行状态。 OnStop被调用,但是我无法确定在守护程序模式下正在调用什么。

我使用ping来使容器保持 Activity 状态:

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

docker 文件:
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 }

最佳答案

我认为您可能对RUNCMDENTRYPOINT有误解。
This article很好地解释了这一点,因此请检查一下。

尝试更改您的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

我猜你把那个无限循环保持了容器的生命,但实际上并不需要它,所以我把它拿了出来。

关于c# - Windows服务在Docker容器中启动后立即关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54149206/

相关文章:

java - 不支持的 major.minor 版本 java 作为带有 procrun 的 Windows 服务

c# - 如何选择 serviceStatus.dwWaitHint 的值?

c# - MvxTabBarViewController 作为第一个 ViewController 没有出现

c# - 转到 Controller 显示 "Unable to find a matching controller."错误

docker - `docker run` 作为级长任务

amazon-web-services - `the node was low on resource imagefs` -- 导致 pod 定期被驱逐

c++ - ATL 服务中的 COM 对象生命周期管理

c# - 在 C# 中用鼠标画线的正确方法是什么

c# - Json 在应该是 Pascal Case 时返回小写

javascript - 如何在 Node.js 中构建集成测试和微服务架构