首页 > 解决方案 > docker 无法访问 API dotnet

问题描述

我正在尝试使用 dotnet api 创建一个容器,但是在构建并使用 docker run 命令之后,它无法访问。我需要了解错误发生在哪里才能修复它。

我的一些发行版是 Ubuntu,使用 docker 版本 18.09.5 并使用图像创建 Dockerfile:

microsoft/dotnet:2.2-sdk-alpine microsoft/dotnet:2.2-aspnetcore-runtime-alpine

dockerfile 内容:

FROM microsoft/dotnet:2.2-sdk-alpine AS build-env
WORKDIR /app
ENV ASPNETCORE_URLS http://0.0.0.0:5000

COPY source/*.csproj ./
RUN dotnet restore

COPY source/ ./
RUN dotnet publish -c Release -o out


FROM microsoft/dotnet:2.2-aspnetcore-runtime-alpine
WORKDIR /app
COPY --from=build-env /app/out .

EXPOSE 5000
ENTRYPOINT ["dotnet", "devops-test.dll", "--urls", "http://0.0.0.0:5000"]

构建命令:

docker build -t freitas/apidotnet .

用于运行应用程序的突击队:

docker run -it -p 5000:5000 freitas/apidotnet

运行后,显示此消息:

warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
      No XML encryptor configured. Key {09e12a74-3a22-4ff3-b882-3f546d91d02a} may be persisted to storage in unencrypted form.
warn: Microsoft.AspNetCore.Server.Kestrel[0]
      Unable to bind to http://localhost:5000 on the IPv6 loopback interface: 'Address not available'.
Hosting environment: Production
Content root path: /app
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.

但是,我尝试访问浏览器http://localhost:5000或使用邮递员获取 api,但没有响应。

我对此没有想法。抱歉我的英语不好,感谢您的帮助。

标签: apidockerasp.net-core.net-coredockerfile

解决方案


我注意到的是输出显示,http://localhost:5000但您的 docker 文件有多个http://0.0.0.0:5000.

你没有展示你的program.cs,所以我假设你有类似的东西:

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .UseUrls(new[] { "http://localhost:5000" });

这似乎是导致问题的原因。您正在提供从多个地方收听的 URL:

  • ASPNETCORE_URLS
  • 命令行 [--urls]
  • 程序.cs

并且它们是按此顺序应用的,因此该program.cs设置获胜。因此,出于某种原因,您的容器正在侦听,localhost:5000但没有从外部到达(其他人可能能够解释为什么会这样??)

解决方法是UseUrls从容器中删除该行program.cs并重建您的容器。


推荐阅读