簡體   English   中英

在 Linux 應用服務上的 docker 容器中運行.Net Core 控制台應用

[英]Running .Net Core console app in docker container on Linux App Service

背景

我有一個 .NET Core 3.1 控制台應用程序,它是一個長時間運行的進程。 基本上,一些邏輯在無限循環中運行,每個循環都有延遲。

I'm currently using Visual Studio to package this app up in a docker container and then deploy to a Linux App Service in Azure. 這一切都有效。 我能夠將 docker 容器發布到 Azure 容器注冊表,然后將我的 Linux 應用服務指向容器。 容器成功啟動,我可以在 Azure 中顯示的日志中從我的應用程序中看到一些控制台 output。 那么,一切都好嗎? 不完全的!

(我知道這通常是您可以將 WebJob 用於(無容器)的東西,但是 Linux 應用服務還不支持 WebJobs。)

問題

Azure App Service 似乎默認在端口 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 的 Window 應用服務。

作為一種解決方法,您可以使用沒有端點的 asp.net 核心應用程序並在 BackgroundService 中運行您的邏輯。

請參閱: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-5.0&tabs=visual-studio

只需添加到共享的解決方法。 您可以嘗試配置平台在重新啟動容器之前等待的時間。

為此,請將WEBSITES_CONTAINER_START_TIME_LIMIT應用設置設置為您想要的值。

默認值為 230 秒,最大值為1800秒。

為此,請從 Azure 門戶 > 導航到您的 WebApp > 在設置刀片 > Go 到“ Configuration ” > 添加上述應用程序設置與“名稱”和 1800 作為“值”。

此外,還有以下幾點:

我需要在內置容器的代碼中使用 PORT 變量嗎? 不,由於自動端口檢測,不需要 PORT 變量。 如果未檢測到端口,則默認為 80。

要手動配置自定義端口,請使用EXPOSE中的 EXPOSE 指令和應用程序設置WEBSITES_PORT以及要在容器上綁定的端口值。

我是否需要將WEBSITES_PORT用於自定義容器? 是的,這是自定義容器所必需的。 要手動配置custom port ,請使用 Dockerfile 中的 EXPOSE 指令和應用程序設置 WEBSITES_PORT 以及要綁定到容器的端口值。

我可以在 Docker 圖像中使用 ASPNETCORE_URLS 嗎? 是的,在 .NET 核心應用程序啟動之前覆蓋環境變量。 例如在 init.sh 腳本中: export ASPNETCORE_URLS={Your value}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM