我们有一个内部开发的 C# .NET 应用程序,我们正试图将其放入 Windows 容器中。该应用程序最初设计为作为服务运行,但容器似乎更适合作为进程运行。所以开发人员做了一些小改动,我们现在可以从命令行运行应用程序。它在 Win 10、2012 R2、2016 和 2019 上成功运行。
但是,当尝试在 2016 或 2019 容器上运行完全相同的应用程序时,我们收到错误消息:
Cannot start service from the command line or a debugger. A Windows Service must first be installed (using installutil.exe) and then start with the ServerExplorer, Windows Services Administrative tool or the NET START command.
为什么在容器中运行会改变应用程序的运行方式?应用程序没有不包含在应用程序中的依赖项(.NET 除外)。
我能够成功地将应用程序作为服务安装在容器中,并在没有错误的情况下启动服务。然而试图 curl http://localhost即使端口通过 docker run 中的 -p 80:80
选项公开,容器内或容器外也会失败。
我已经看到这个应用程序的以前版本作为一个进程在 docker 容器中成功运行,所以我认为它必须是 C# 的一些警告,但我不是开发人员,我得到一个标准的“它运行在主机,这一定是一个 docker 问题”来 self 们开发人员的回答。
最佳答案
事实证明,代码在 Environment.UserInteractive
上有一个 if 语句,告诉它是作为控制台还是作为服务。在 Windows Docker 容器中,Environment.UserInteractive
由于某种原因总是触发为 false,这迫使应用程序即使在作为控制台运行时也能提供服务。我们使用环境变量来覆盖 if。
值得注意的是,显然在 .NET Core 中,变量始终触发为真,考虑到 Linux 应用程序通常触发的方式,这可能会有所帮助。
关于C# 应用程序在 docker 中失败并显示 "cannot start service from the command line"但在主机上没有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56447800/