使用 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/"]
您只需要 restore
、build
和 publish
主项目。它会看到项目引用并包含它们。
我有一个 .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/"]
您只需要 restore
、build
和 publish
主项目。它会看到项目引用并包含它们。