使用docker在dotnet中隐式加载包



我有一个.NET项目:TestApp。我可以使用Rider运行配置和Target框架net5.0(在Mac上(成功运行它。我正试着用Docker把它装进集装箱。

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

根据文档,我已经生成了我认为是标准的Dockerfile:

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"]

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

无法加载文件或程序集"Azure.Core,版本=1.20.0.0,区域性=中性,PublicKeyToken=92742159e12e44c8"。系统找不到指定的文件。System.IO.FileNotFoundException:未能加载文件或程序集"Azure.Core,版本=1.20.0.0,区域性=中性,PublicKeyToken=92742159e12e44c8"。系统找不到指定的文件。

但是,当我查看容器文件时,我可以在/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作为主项目。它将看到项目参考并包括它们。

最新更新