使用 docker 在 dotnet 中隐式加载包

implicit package loading in dotnet with docker

我有一个 .NET 项目:TestApp。我可以使用 Rider 运行 配置和 Target 框架 net5.0(在 Mac 上)成功将其设置为 运行。我正在尝试使用 Docker.

将其容器化

在这种情况下,TestApp 的 .csproj 文件没有明确命名所有需要的包;当引用相应的项目时,会隐式加载其他所需的包。也就是说,我的项目引用了同一个解决方案中的其他项目。

根据文档,我生成了我认为是标准的 Docker 文件:

FROM mcr.microsoft.com/dotnet/runtime:5.0 AS base
WORKDIR /app

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /src
COPY ["TestApp/TestApp.csproj", "TestApp/"]
RUN dotnet restore "TestApp/TestApp.csproj"
COPY . .
WORKDIR "/src/TestApp"
RUN dotnet build "TestApp.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "TestApp.csproj" -c Release -o /app/publish

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

当从 Docker 文件 运行 宁应用程序时,它在第一个隐式引用的包上失败。在这种情况下,它是一个 Azure 包:

Could not load file or assembly 'Azure.Core, Version=1.20.0.0, Culture=neutral, PublicKeyToken=92742159e12e44c8'. The system cannot find the file specified. System.IO.FileNotFoundException: Could not load file or assembly 'Azure.Core, Version=1.20.0.0, Culture=neutral, PublicKeyToken=92742159e12e44c8'. The system cannot find the file specified.

但是,当我查看容器文件时,我可以在 /app 目录中看到丢失的包:

/app/Azure.Core.dll

所以,我不确定我在这里遗漏了什么。我可以将适当的 PackageReference 添加到 TestApp.csproj 文件,但我将追查解决方案中其他地方已经列出的大量冗余依赖项。

我认为在容器中打开一个终端并查看我可以从调用 dotnet 中学到什么可能会有所帮助,但我发现 final 没有其余的其中的 SDK。

有关如何解决此问题的任何建议都将非常有帮助!

如果您的项目引用同一解决方案中的其他项目,那么您需要在执行 dotnet restore 之前复制所有 .csproj 文件。即

COPY ["TestApp/TestApp.csproj", "TestApp/"]

应该是

COPY ["TestApp/TestApp.csproj", "TestApp/"]
COPY ["Project2/Project2.csproj", "Project2/"]
COPY ["Project3/Project3.csproj", "Project3/"]

您只需要 restorebuildpublish 主项目。它会看到项目引用并包含它们。