C# 如何在.NET核心应用程序docker映像中包含依赖项?
我正在尝试构建一个.NET核心应用程序docker映像。但我不知道该如何将项目的NuGet依赖项放到映像中 为了简单起见,我创建了一个.NET核心控制台应用程序:C# 如何在.NET核心应用程序docker映像中包含依赖项?,c#,visual-studio,docker,.net-core,C#,Visual Studio,Docker,.net Core,我正在尝试构建一个.NET核心应用程序docker映像。但我不知道该如何将项目的NuGet依赖项放到映像中 为了简单起见,我创建了一个.NET核心控制台应用程序: using System; using Newtonsoft.Json; namespace ConsoleCoreTestApp { public class Program { public static void Main(string[] args) {
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依赖项。当我从VisualStudio运行应用程序时,一切正常
但是,当我从项目中创建Docker映像并尝试从中执行应用程序时,它找不到依赖项:
# 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'
这是意料之中的,因为Visual Studio没有将Newtonsoft.Json.dll
复制到输出文件夹
下面是我正在使用的Dockerfile
:
FROM microsoft/dotnet:1.0.0-core
COPY bin/Debug /app
有没有建议的方法来处理这个问题
我不想在容器内部运行dotnet restore
(因为我不想每次容器运行时都重新下载所有依赖项)
我想我可以在Dockerfile
中添加RUN dotnet restore
条目,但是我不能再使用microsoft/dotnet:-core
作为基本映像了
我找不到一种方法让Visual Studio将所有依赖项复制到输出文件夹中(就像常规的.NET Framework项目一样)。我最近写了一篇关于此的文章。我使用的Dockerfile内容是(稍微修改以删除ASP.NET核心位):
运行
docker build
时,它将Dockerfile用作构建映像的“配方”。它将首先运行dotnet restore
和dotnet build
,然后将所有内容打包到映像中。生成的图像包含了应用程序在任何Docker主机上运行所需的所有内容。经过进一步阅读,我终于找到了答案
您运行的不是dotnet build
:
dotnet publish
这将把所有文件(包括依赖项)放在
publish
文件夹中。然后,此文件夹可以直接与microsoft/dotnet:-core
图像一起使用。我不是.net用户,请原谅我的无知。。。为什么添加运行dotnet restore
会阻止您使用dotnet基本映像?@Matt是正确的,它不应该阻止您使用microsoft/dotnet
基本映像。@Matt因为核心映像不包含restore命令。@SebastianKrysmanski。。所以像是jre而不是jdk。缺少一些开发代码。@Matt是的,是这样的。核心映像只是运行时。不幸的是,这不适用于dotnet:xxx核心映像。不过,我不确定dotnet
和dotnet:xxx core
作为基本映像之间的区别是否相关。@SebastianKrysmanski只是好奇,为什么要使用dotnet:xxx core
而不是dotnet:latest
?没有特殊原因。对我来说,这似乎是最符合逻辑/最简单的解决方案。另外,我尽量不把源代码放在容器中。
dotnet publish