C# 应用在 Docker 中无法从命令行启动服务,但在主机上可以。

3
我们有一个内部开发的C# .NET应用程序,正在尝试将其放入Windows容器中。该应用程序最初是设计为作为服务运行的,但似乎容器更适合作为进程运行。因此,开发人员进行了一些小的更改,现在我们可以从命令行运行该应用程序。它在Win 10、2012 R2、2016和2019上成功运行。
然而,当尝试在2016或2019容器上运行完全相同的应用程序时,我们会收到以下错误消息:
“无法从命令行或调试器启动服务。必须首先使用 installutil.exe 安装 Windows 服务,然后使用 ServerExplorer、Windows Services 管理工具或 NET START 命令启动。”
为什么在容器中运行会改变应用程序的运行方式?除了.NET之外,该应用程序没有未包含在应用程序中的依赖项。
我能够在容器中成功安装应用程序并启动服务而不出现错误。但是,即使通过docker run选项中的-p 80:80公开端口,在容器内部或外部尝试curl http://localhost仍然失败。
我曾见过先前版本的应用程序在Docker容器中作为一个进程成功运行,所以我认为这一定是C#的某些警告,但我不是开发人员,我们的开发人员给出了一个标准的“它在主机上运行,一定是Docker的问题”的答案。
1个回答

4

实际上,代码中有一个 if 语句针对 Environment.UserInteractive 进行判断,以确定它是应该作为控制台还是服务运行。在 Windows Docker 容器中,由于某种原因,Environment.UserInteractive 总是触发为 false,导致应用程序即使作为控制台运行也不得不以服务形式运行。我们使用了环境变量来覆盖此 if 语句。

值得注意的是,在 .NET Core 中,这个变量总是触发为 true,这可能会有所帮助,因为 Linux 应用程序通常是以这种方式触发的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接