在Linux应用服务中的Docker容器中运行.Net Core控制台应用程序

3

背景

我有一个长时间运行的.NET Core 3.1控制台应用程序,基本上是在无限循环中运行一些逻辑,并每次循环延迟一段时间。

我目前使用Visual Studio将此应用程序打包到Docker容器中,然后部署到Azure的Linux应用服务中。这一切都有效。我能够将Docker容器发布到Azure容器注册表,然后将我的Linux应用服务指向该容器。容器成功启动,并且我能够在Azure中显示的日志中看到我的应用程序的一些控制台输出。所以,一切都好吗?不完全是!

(我知道这通常可以使用WebJob(sans containers)来完成,但是Linux应用服务尚不支持WebJobs。)

问题

Azure应用服务似乎默认使用端口80 ping我的容器,以检查我的应用程序是否成功启动。但是,这是一个控制台应用程序,而不是Web/ASP应用程序。因此,可以理解,Azure会给出以下错误:

2021-01-22T02:12:24.506Z ERROR - Container for site <sitename> did not start within expected time limit. Elapsed time = 230.4560202 sec
2021-01-22T02:12:24.508Z ERROR - Container didnt respond to HTTP pings on port: 80, failing site start. See container logs for debugging.
2021-01-22T02:12:24.553Z INFO  - Stopping site because it failed during startup.

有什么方法可以绕过这个问题吗?不,目前它不能是一个带有WebJob的窗口应用程序服务。

2个回答

2
只是补充上述解决方法。您可以尝试配置平台在重新启动容器之前等待的时间。
要这样做,请将WEBSITES_CONTAINER_START_TIME_LIMIT应用设置为所需值。
默认值为230秒,最大值为1800秒。
要执行此操作,请从Azure门户>导航到您的WebApp>在“设置”选项卡下>转到“配置”>使用1800作为“值”的“名称”添加上述应用设置。
另外,还有以下要点:
我需要在内置容器中的代码中使用PORT变量吗?
不需要,由于自动端口检测,因此不需要PORT变量。如果未检测到端口,则默认为80。
要手动配置自定义端口,请在Dockerfile中使用EXPOSE指令和应用设置WEBSITES_PORT,并提供要绑定到容器上的端口值。
我需要为自定义容器使用WEBSITES_PORT吗?
是的,这对于自定义容器是必需的。要手动配置自定义端口,请在Dockerfile中使用EXPOSE指令和应用设置WEBSITES_PORT,并提供要绑定到容器上的端口值。
我可以在Docker镜像中使用ASPNETCORE_URLS吗?
是的,在.NET core应用程序启动之前覆盖环境变量。
例如,在init.sh脚本中:export ASPNETCORE_URLS={您的值}

2

我尝试过这个,但是Docker容器的预热逻辑会不断进行ping操作,导致失败并最终关闭应用程序。有什么方法可以解决这个问题吗?正在为站点xxxx启动容器xxxx的预热请求 等待容器xxxx对预热请求的响应 容器xxxx未在预期时间内启动站点xxxx。 错误 - 容器xxxx在端口8080上没有响应HTTP ping,站点启动失败。 由于启动失败,停止站点xxxx。 - Milan
你的应用程序运行在哪个端口?Docker容器是否配置为公开该端口? - Andrew

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