我在Docker的Linux容器中运行Dotnet Core 2.2。
我尝试了许多不同的配置/环境选项-但是我仍然回到内存不足的问题('docker events'报告OOM)。
在生产中,我托管在Ubuntu上。对于开发,我在Windows的Docker上使用Linux容器(MobyLinux)。
我已经回到运行Web API模板项目,而不是我的实际应用程序。我从字面上返回一个字符串,什么也不做。如果我称它为卷曲的大约1000倍,则容器将死亡。垃圾收集器似乎根本没有工作。
尝试在docker-compose中设置以下环境变量:
DOTNET_RUNNING_IN_CONTAINER=true
DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=true
ASPNETCORE_preventHostingStartup=true
Run Code Online (Sandbox Code Playgroud)
还可以在docker-compose中尝试以下操作:
mem_reservation: 128m
mem_limit: 256m
memswap_limit: 256m
Run Code Online (Sandbox Code Playgroud)
(这些只会使它更快死掉)
尝试将以下内容设置为true或false,没有区别:
ServerGarbageCollection
Run Code Online (Sandbox Code Playgroud)
我尝试改为作为Windows容器运行,这不是OOM-但它似乎也不尊重内存限制。
我已经排除了使用HttpClient和EF Core的可能性-因为在我的示例中甚至没有使用它们。我已经读过一些关于在端口443上监听的问题-因为我可以让容器整天处于空闲状态,如果我在一天结束时进行检查-它占用了更多的内存(不是很大,但是增长)。
我的API中的示例:
// GET api/values/5
[HttpGet("{id}")]
public ActionResult<string> Get(int id)
{
return "You said: " + id;
}
Run Code Online (Sandbox Code Playgroud)
用Curl调用示例:
curl -X GET "https://localhost:44329/api/values/7" -H "accept: text/plain" --insecure
Run Code Online (Sandbox Code Playgroud)
(重复1,000次左右)
预期:对于非常原始的请求,RAM使用率保持较低
实际:RAM使用率持续增长,直到出现故障
完整的Dockerfile:
FROM microsoft/dotnet:2.2-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM microsoft/dotnet:2.2-sdk AS build
WORKDIR /src
COPY ["WebApplication1/WebApplication1.csproj", "WebApplication1/"]
RUN dotnet restore "WebApplication1/WebApplication1.csproj"
COPY . …Run Code Online (Sandbox Code Playgroud)