【问题标题】:Not able to containerise .net 5.0 web API无法将 .net 5.0 Web API 容器化
【发布时间】:2021-09-16 09:26:25
【问题描述】:

我需要容器化一个在 Windows IIS 服务器上运行良好的 .net 5.0 Web 应用程序。我在docker文件下面写了。我可以使用 docker 文件构建映像,但是当我尝试访问它时。我收到无法访问此站点的错误消息。请帮帮我。 docker 新手和 linux 新手。

Docker 文件:

FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base
WORKDIR /app   
EXPOSE 80
ENV ASPNETCORE_URLS="http://*:5000"

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build

WORKDIR /src

COPY ["API/WebUI/Summit.API.csproj", "API/WebUI/"]

COPY ["Application/Summit.Application.csproj", "Application/"]

COPY ["Domain/Shared/Summit.Domain.csproj", "Domain/Shared/"]

COPY ["Domain/SqlKata.Execution/SqlKata.Execution.csproj", "Domain/SqlKata.Execution/"]

COPY ["Domain/QueryBuilder/QueryBuilder.csproj", "Domain/QueryBuilder/"]

COPY ["Infrastructure/Summit.Infrastructure.csproj", "Infrastructure/"]

RUN dotnet restore "API/WebUI/Summit.API.csproj"

COPY . .

WORKDIR "/src/API/WebUI"

RUN dotnet build "Summit.API.csproj" -c Release 

FROM build AS publish

RUN dotnet publish "Summit.API.csproj" -c Release

FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS runtime

WORKDIR /app

COPY --from=publish /src/API/WebUI/bin/Release/net5.0/publish .

EXPOSE 5000

ENTRYPOINT ["dotnet", "Summit.API.dll"] 

我会使用命令 docker container run -itd -p 8000:5000 imageid 从 docker 文件手动构建映像

发布当我尝试访问 http://localhost:5000/swagger 时无法访问它。

请帮帮我。

【问题讨论】:

  • 我认为-p 8000:5000 在本地主机上的端口 8000 上的容器中发布端口 5000,这意味着您需要 http://localhost:8000/swagger。我认为您希望 --publish 而不是 -p 8000:5000 使用 EXPOSE 指令并按原样发布端口 5000。
  • 我需要做什么改变,有什么建议。
  • 如果您想在端口 5000 上发布此内容,请在运行命令中使用 --publish-p 5000:5000 而不是 -p 8000:5000
  • 嗨 @Rup 我试过但无法访问 localhost:5000/swagger/index.html 我正在尝试从运行容器的同一 ubuntu 服务器访问它。
  • 但是,当我检查有关端口号的过程时,我可以在下面看到 docker-pr 357104 root 4u IPv4 2096378 0t0 TCP *:5000 (LISTEN) docker-pr 357108 root 4u IPv6 2096395 0t0 TCP * :5000 (听)

标签: .net docker


【解决方案1】:

您从不使用您创建的base 临时图像,因此您的 ASPNETCORE_URLS 环境变量将被丢弃。这意味着您的应用正在侦听默认端口 80。

此外,您的应用未在开发模式下运行,这意味着 Swagger 将不可用(至少在您使用默认 webapi 模板的情况下)。

试试这个 Dockerfile

FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base
WORKDIR /app   
EXPOSE 5000
ENV ASPNETCORE_URLS="http://*:5000"
ENV ASPNETCORE_ENVIRONMENT=Development

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /src
COPY ["API/WebUI/Summit.API.csproj", "API/WebUI/"]
COPY ["Application/Summit.Application.csproj", "Application/"]
COPY ["Domain/Shared/Summit.Domain.csproj", "Domain/Shared/"]
COPY ["Domain/SqlKata.Execution/SqlKata.Execution.csproj", "Domain/SqlKata.Execution/"]
COPY ["Domain/QueryBuilder/QueryBuilder.csproj", "Domain/QueryBuilder/"]
COPY ["Infrastructure/Summit.Infrastructure.csproj", "Infrastructure/"]
RUN dotnet restore "API/WebUI/Summit.API.csproj"
COPY . .
WORKDIR "/src/API/WebUI"
RUN dotnet build "Summit.API.csproj" -c Release 

FROM build AS publish
RUN dotnet publish "Summit.API.csproj" -c Release

FROM base AS runtime
WORKDIR /app
COPY --from=publish /src/API/WebUI/bin/Release/net5.0/publish .
ENTRYPOINT ["dotnet", "Summit.API.dll"]

构建并运行它

docker build -t myimage .
docker run -d -p 8000:5000 myimage

那么 Swagger 应该可以在 http://localhost:8000/swagger 获得

如果您愿意,您可以从 Dockerfile 中删除 ASPNETCORE_ENVIRONMENT,然后将其传递给您的 docker run 命令。我喜欢在开发时将它放在 Dockerfile 中。

编辑:为了进行测试,我更改了 Dockerfile 中间的构建步骤,因此它会像这样从默认模板创建一个 webapi 应用程序

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /src/API/WebUI
RUN dotnet new webapi -n Summit.API -o .
WORKDIR /src
RUN dotnet restore "API/WebUI/Summit.API.csproj"
WORKDIR "/src/API/WebUI"
RUN dotnet build "Summit.API.csproj" -c Release 

既然它对你不起作用,那么问题可能出在你的代码中。

【讨论】:

  • 不走运,用上面的 dockerfile @hans 试过
  • @ChandraShekhar 我在答案的底部添加了一个构建步骤,证明 Dockerfile 可以与默认的 webapi 应用程序一起使用。既然不适合你,那我觉得你的代码肯定有问题。
  • 但相同的代码库在 Windows IIS 上运行良好
  • 可能有很多原因。不看代码真的很难说出原因。
  • np,感谢您的意见。
猜你喜欢
  • 2021-11-10
  • 2020-12-11
  • 2021-01-23
  • 2021-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 1970-01-01
相关资源
最近更新 更多