多个asp.net核心项目在Docker中出现问题

时间:2020-05-12 06:24:21

标签: c# .net docker asp.net-core .net-core

我使用Visual Studio 2019并用它创建了我的dockerfile。 我的Docker文件

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["BackEnd.service.api.csproj", "BackEnd.service.api"]
COPY ["src/BackEnd.Service.Application/BackEnd.Service.Application.csproj", "src/BackEnd.Service.Application/"]
COPY ["src/BackEnd.Service.Model/BackEnd.Service.Model.csproj", "src/BackEnd.Service.Model/"]
RUN dotnet restore "src/BackEnd.service.api/BackEnd.service.api.csproj"
COPY . .
WORKDIR "/src/src/BackEnd.service.api"
RUN dotnet build "BackEnd.service.api.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "BackEnd.service.api.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "BackEnd.service.api.dll"]

和我的项目树:

enter image description here

现在我遇到此错误:

enter image description here

请帮助我如何更改项目路径以在docker中构建它?

2 个答案:

答案 0 :(得分:0)

问题很可能是您的构建环境。 Visual Studio似乎将您的Web应用程序项目用作构建上下文,这意味着它无法从src文件夹访问您的Application和Model项目。 我可以建议您尝试将具有以下属性的Web应用程序的.csproj文件中的Dockerfile上下文显式设置为可以访问所有项目的src目录:

<PropertyGroup>
   <TargetFramework>netcoreapp3.1</TargetFramework>
   <DockerfileContext>..\</DockerfileContext>
</PropertyGroup>

然后,您可能需要更新Dockerfile,使其指向与src文件夹相关的参考项目(应用程序和模型)。

COPY ["BackEnd.service.api/BackEnd.service.api.csproj", "src/BackEnd.service.api"]
COPY ["BackEnd.Service.Application/BackEnd.Service.Application.csproj", "src/BackEnd.Service.Application/"]
COPY ["BackEnd.Service.Model/BackEnd.Service.Model.csproj", "src/BackEnd.Service.Model/"]
RUN dotnet restore "src/BackEnd.service.api/BackEnd.service.api.csproj"

您可能需要稍微浏览一下目录,但是记住构建上下文是关键非常重要。

或者,您可以尝试向解决方案中添加一个docker-compose项目,并使用该项目来构建Dockerfile。您将能够在docker-compose.yml文件中为每个应该构建的项目指定构建上下文。

答案 1 :(得分:0)

我建议按照本文aspnetcore-app-dockerfiles手动制作dockerfile,而不要使用vs项目的docker模板。另外,使用.dockerignore将帮助您简化dockerfile脚本,忽略文件可能不需要运行时。

这是我项目中的一个示例,希望对您有帮助。

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-bionic AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-bionic AS build
WORKDIR /build
COPY . .

RUN dotnet restore
RUN dotnet publish "src/BackEnd.service.api/BackEnd.service.api.csproj" -c Release -o /app --no-restore

FROM base AS final
WORKDIR /app
COPY --from=build /app .
ENTRYPOINT ["dotnet", "BackEnd.service.api.dll"]