我有一个.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/"]
您只需要restore
、build
和publish
作为主项目。它将看到项目参考并包括它们。