ASP.NET Core API Docker部署访问返回404 Not Found错误
问题原因
该404错误由两个配置问题共同导致:
- .NET Core 3.1 版本的Kestrel默认仅监听
localhost回环地址的请求,而容器内的回环地址与宿主机/外部网络是隔离的,外部请求到达容器映射端口时,Kestrel未在对外网卡上监听对应端口,无法正常响应。 - 现有Dockerfile的
EXPOSE指令全部写在编译构建阶段,最终生成的运行时镜像未声明服务端口,且未配置Kestrel的对外绑定规则,即使启动容器时做了端口映射,应用也无法接收外部流量。
另外Dockerfile中多余的RUN dotnet build步骤无实际作用,dotnet publish会自动完成编译流程,该指令只会额外增加镜像构建层数。
修复步骤
1. 修正Dockerfile配置
将端口声明移到运行时镜像阶段,同时配置Kestrel监听所有网卡地址,修正后的完整Dockerfile如下:
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env WORKDIR /app # 复制项目文件并还原依赖 COPY *.csproj ./ RUN dotnet restore # 复制剩余代码并发布 COPY . ./ RUN dotnet publish -c Release -o out # 构建运行时镜像 FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 WORKDIR /app EXPOSE 80 EXPOSE 443 COPY --from=build-env /app/out . # 启动时绑定所有网卡的80端口,避免仅监听localhost ENTRYPOINT ["dotnet", "TodoApi.dll", "--urls", "http://0.0.0.0:80"]
如果不想把绑定规则写在启动命令里,也可以在运行时阶段添加环境变量实现相同效果,添加后可保留原ENTRYPOINT写法:
ENV ASPNETCORE_URLS=http://0.0.0.0:80
2. 重新构建并启动容器
执行以下命令禁用缓存重新构建镜像,避免旧版本镜像缓存导致配置不生效:
docker build --no-cache -t todoapi .
启动容器时将宿主机端口映射到容器80端口即可,无需映射多余端口:
docker run -d -p 8080:80 --name todoapi-test todoapi
启动后访问http://localhost:8080/api/todo即可正常获取接口响应。
如果需要验证容器内服务是否正常,可执行以下命令在容器内部发起请求,能正常返回JSON数据即说明应用运行正常:
docker exec -it todoapi-test curl http://localhost:80/api/todo
内容的提问来源于stack exchange,提问作者someguyhello
相关产品推荐
相关产品推荐

