如何在.NET核心应用程序泊坞窗图像中包含依赖关系?
我正在尝试构build一个.NET Core应用程序泊坞窗图像。 但我无法弄清楚我应该如何将项目的NuGet依赖关系放入图像中。
为了简单起见,我创build了一个.NET Core控制台应用程序:
using System; using Newtonsoft.Json; namespace ConsoleCoreTestApp { public class Program { public static void Main(string[] args) { Console.WriteLine($"Hello World: {JsonConvert.False}"); } } }
它只对Newtonsoft.Json
有一个NuGet依赖。 当我从Visual Studio运行应用程序时,一切工作正常。
但是,当我从项目中创build一个Docker镜像并尝试从那里执行应用程序时,它无法find依赖关系:
# dotnet ConsoleCoreTestApp.dll Error: assembly specified in the dependencies manifest was not found -- package: 'Newtonsoft.Json', version: '9.0.1', path: 'lib/netstandard1.0/Newtonsoft.Json.dll'
这是可以预料的,因为Newtonsoft.Json.dll
不会被Visual Studio复制到输出文件夹中。
这里是我正在使用的Dockerfile
:
FROM microsoft/dotnet:1.0.0-core COPY bin/Debug /app
有没有一个build议的方式来处理这个问题?
我不想在容器内运行dotnet restore
(因为我不想每次运行容器都重新下载所有的依赖项)。
我想我可以添加一个RUN dotnet restore
条目到Dockerfile
但是我不能再使用microsoft/dotnet:<version>-core
作为基础映像。
我无法find一种方法使Visual Studio将所有依赖项复制到输出文件夹中(就像使用常规的.NET Framework项目一样)。
经过一番阅读,我终于明白了。
而不是dotnet build
你运行:
dotnet publish
这将把所有文件(包括依赖关系)放在publish
文件夹中。 然后这个文件夹可以直接使用microsoft/dotnet:<version>-core
图像。
我最近写了一个教程 。 我使用的Dockerfile内容(略有修改,以删除ASP.NET核心位):
FROM microsoft/dotnet:latest COPY . /app WORKDIR /app RUN ["dotnet", "restore"] RUN ["dotnet", "build"] ENTRYPOINT ["dotnet", "run"]
当你运行docker build
,它使用Dockerfile作为一个“配方”来build立图像。 它将首先运行dotnet restore
和dotnet build
, 然后将所有东西打包到图像中。 生成的图像具有应用程序需要在任何Docker主机上运行的所有内容。