C# 应用程序在 docker 中失败并显示 "cannot start service from the command line"但在主机上没有

标签 c# web-services docker service containers

我们有一个内部开发的 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/

相关文章:

java - 契约(Contract)最后的网络服务?

cmd - 如何覆盖 docker run 行中的 CMD 命令

c# - 在 MVC c# 中检测应用程序的现有下载

java - 如何从 XFire AbstractHandler 的 invoke() 方法中获取 ServletRequest 对象?

c# - DateTime.TryParse 似乎正在丢失原始时区信息并转换为服务器时间

ruby-on-rails - 通过先写入 redis 来加速 web 服务,然后写入磁盘?

docker - Netflix | Spring Cloud Eureka部署在ECS上时未注册

Docker-Compose 挂载卷覆盖主机文件

c# - 具有自定义返回类型的通用扩展方法

c# - C# 中的 DES 初始化向量