【发布时间】: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