【问题标题】:AspNetCore project gives System.IO.FileNotFoundException only on linux containerAspNetCore 项目仅在 linux 容器上提供 System.IO.FileNotFoundException
【发布时间】:2018-02-15 16:43:30
【问题描述】:

我有一个运行 AspNetCore 网络服务器的 dotnet 核心项目。我使用了一些其他的 DLL,它们是相当简单的类库。

我可以从 git 下载存储库到我的 windows PC 上,进去运行:

dotnet restore
dotnet run 

一切正常。

但是,如果我在基于 microsoft/aspnetcore-build:1.0.7 的 docker 容器中执行相同的操作,则会在 HTTP PUT 上收到以下错误:

fail: Microsoft.AspNetCore.Server.Kestrel[13]
      Connection id "0HLBKHRVH7OND": An unhandled exception was thrown by the application.
System.IO.FileNotFoundException: Could not load file or assembly 'KolData, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. The system cannot find the file specified.

现在,文件 Koldata.dll 确实存在于 git 存储库中,并且位于 bin/Debug/netcoreapp1.1 文件夹中。

我可以通过删除构建目录中的 KolData.dll 文件在 Windows 中重新创建错误。所以似乎 Linux 上的 dotnet core 看不到该文件,我不确定为什么。

我什至尝试将 DLL 替换为从源代码构建在机器上的版本,但仍然会出现相同的错误。

一个解决方案

我设法通过更改 csproj 文件的目标框架使其工作:

<PropertyGroup>
    <TargetFramework>netcoreapp1.1</TargetFramework>
    <PackageTargetFallback>portable-net45+win8</PackageTargetFallback>
</PropertyGroup> 

到:

 <PropertyGroup>
    <TargetFramework>netcoreapp1.0</TargetFramework>
    <PackageTargetFallback>portable-net45+win8</PackageTargetFallback>
  </PropertyGroup> 

这感觉有点奇怪,因为 KolData.dll 是在 1.1 上运行的 但现在它运行没有错误。

【问题讨论】:

  • KolData 看起来不像 package 名称。您是否忘记在容器中发布您的 DLL 之一?除非您创建容器来构建项目,否则它不应包含任何存储库或构建目录
  • 正如我所说。 Koldata.dll 在存储库中,在项目中,在构建目录中。所以文件在它应该在的位置,但是 dotnet core 没有看到它,也没有加载它。
  • 您说文件在存储库中并输出到构建目录,但您确认包在 docker 映像中吗?你是如何构建 docker 镜像的?
  • 我只是使用 microsoft/aspnetcore-build:1.0.7 映像来创建一个容器,然后我使用 exec 打开一个 bash。然后我只是写命令,比如 'git clone ' 然后 cd 和 dotnet restore 等等。
  • @DaveAlger 该图像用于构建,而不是部署。这就是为什么说“它在存储库中”听起来很奇怪。除非您在该映像中构建您的项目,否则您不能假设它可以构建或运行。例如,将任何内容放在应用程序的 bin/Debug 文件夹中可以保证在dotnet run 运行构建步骤时将其删除。通过删除输出目录中的文件开始构建,即bin/Debug

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


【解决方案1】:

您必须创建 Dockerfile 并构建 docker 映像。

编辑: Dockerfile 应该是什么样子的示例。以下文件构建 Visual Studio 项目并创建 docker 映像。

FROM microsoft/aspnetcore:2.0 AS base
WORKDIR /app
EXPOSE 80

FROM microsoft/aspnetcore-build:2.0 AS build
WORKDIR /src
COPY *.sln ./
COPY WebApplication/WebApplication.csproj WebApplication/
RUN dotnet restore
COPY . .
WORKDIR /src/WebApplication
RUN dotnet build -c Release -o /app

FROM build AS publish
RUN dotnet publish -c Release -o /app

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

如果您已经使用 Dockerfile 构建了应用程序,请将 .dll 包含在容器中:

FROM microsoft/aspnetcore:2.0
WORKDIR /app
COPY . .
ENTRYPOINT ["dotnet", "application.dll"]

构建并运行您的应用:

docker build -t application
docker run -d -p 8000:80 application

Building Docker Images for .NET Core Applications

【讨论】:

  • 所有这一切都是用我的内置应用程序创建一个图像。 (这是我通过从 bash 构建的手动过程所做的)。然后我从这个图像运行容器,向网络服务器发出推送并得到完全相同的错误。
  • 我不明白您所说的“向网络服务器发出推送”是什么意思。如果您在应用程序中引用任何库或项目,则必须将其包含在 Dockerfile 中并与您的应用程序一起构建。
  • 对不起,我是说 Put。 Http Put。
  • 我假设 KolData.dll 是您从其他项目中引用的库。您要么在容器中没有 KolData.dll,要么路径不正确。在创建包含多个项目的容器时,您必须包含从主应用程序引用的所有项目(.dll 文件)。
  • 正如我从一开始所说的“它在 bin/Debug/netcoreapp1.1 文件夹中。” - 它应该在哪里。我已经设法通过将项目降级到 netcoreapp1.0(而 Koldata.dll 仍然运行 1.1)来使其工作。对我来说似乎很奇怪。
猜你喜欢
  • 2021-10-26
  • 2020-05-10
  • 1970-01-01
  • 2017-12-20
  • 2010-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多