C# AspNetCore项目仅在linux容器上提供System.IO.FileNotFoundException

C# AspNetCore项目仅在linux容器上提供System.IO.FileNotFoundException,c#,docker,asp.net-core,.net-core,C#,Docker,Asp.net Core,.net Core,我有一个运行aspnetcorewebserver的dotnetcore项目。我使用了另外两个DLL,它们是相当简单的类库 我可以将存储库从git下载到我的windows PC上,进入并运行: dotnet restore dotnet run 一切正常 但是,如果我在基于microsoft/aspnetcore build:1.0.7的docker容器中执行相同的操作,则在HTTP PUT上会出现以下错误: fail: Microsoft.AspNetCore.Server.Kestrel

我有一个运行aspnetcorewebserver的dotnetcore项目。我使用了另外两个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上的DotnetCore无法看到该文件,我不确定为什么

我甚至尝试过用源代码构建在机器上的版本替换DLL,但它仍然会带来相同的错误

一个解决方案

我通过将csproj文件的目标框架从以下内容更改为使其工作:

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

netcoreapp1.1
portable-net45+win8
致:


netcoreapp1.0
portable-net45+win8
这感觉有点奇怪,因为KolData.dll在1.1上运行
但是现在它运行时没有错误。

您必须创建docker文件并构建docker映像

编辑: Dockerfile应该是什么样子的示例。下面的文件构建VisualStudio项目并创建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在容器中构建了应用程序include.dll:

FROM microsoft/aspnetcore:2.0
WORKDIR /app
COPY . .
ENTRYPOINT ["dotnet", "application.dll"]
构建并运行您的应用程序:

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

KolData
看起来不像包名。您是否忘记在容器中发布一个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
所做的一切就是创建一个内置了我的应用程序的映像。(这就是我在从bash构建的手动过程中所做的)。然后我从这个图像运行容器,向Web服务器发出推送,得到完全相同的错误。我不明白“向Web服务器发出推送”是什么意思。如果您在应用程序中引用任何库或项目,则必须将其包含在Dockerfile中,并与应用程序一起构建。对不起,我的意思是放置。我假设KolData.dll是您从其他项目引用的库。容器中没有KolData.dll,或者路径不正确。当创建包含多个项目的容器时,必须包含从主应用程序引用的所有项目(.dll文件)。正如我从一开始就说过的,“它在bin/Debug/netcoreapp1.1文件夹中。”-它应该在哪里。我已经通过将项目降级到netcoreapp1.0(而Koldata.dll仍然运行1.1)使其正常工作。对我来说似乎是一种奇怪的情况。
docker build -t application
docker run -d -p 8000:80 application