如何在 .NET Core 应用 docker 图像中包含依赖项?
How to include dependencies in .NET Core app docker image?
我正在尝试构建 .NET Core 应用 docker 映像。但是我不知道应该如何将项目的 NuGet 依赖项添加到映像中。
为简单起见,我创建了一个 .NET Core 控制台应用程序:
using System;
using Newtonsoft.Json;
namespace ConsoleCoreTestApp
{
public class Program
{
public static void Main(string[] args)
{
Console.WriteLine($"Hello World: {JsonConvert.False}");
}
}
}
它只有一个 NuGet 依赖于 Newtonsoft.Json
。当我 运行 来自 Visual Studio 的应用程序时,一切正常。
但是,当我从项目创建 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'
这是意料之中的,因为 Newtonsoft.Json.dll
没有被 Visual Studio 复制到输出文件夹。
这是我正在使用的Dockerfile
:
FROM microsoft/dotnet:1.0.0-core
COPY bin/Debug /app
是否有处理此问题的推荐方法?
我不想 运行 dotnet restore
在容器内(因为我不想每次容器 运行 时都重新下载所有依赖项)。
我想我可以在 Dockerfile
中添加一个 RUN dotnet restore
条目,但是我不能再使用 microsoft/dotnet:<version>-core
作为基础图像了。
而且我找不到使 Visual Studio 将所有依赖项复制到输出文件夹中的方法(就像对常规 .NET Framework 项目所做的那样)。
我最近就此写了一篇tutorial。我使用的 Docker 文件内容是(稍微修改以删除 ASP.NET 核心位):
FROM microsoft/dotnet:latest
COPY . /app
WORKDIR /app
RUN ["dotnet", "restore"]
RUN ["dotnet", "build"]
ENTRYPOINT ["dotnet", "run"]
当您 运行 docker build
时,它使用 Docker 文件作为 "recipe" 来构建图像。它会先 运行 dotnet restore
和 dotnet build
, 然后 将所有内容打包到图像中。生成的图像包含应用在任何 Docker 主机上 运行 所需的一切。
经过更多阅读,我终于明白了。
而不是 dotnet build
你 运行:
dotnet publish
这会将所有文件(包括依赖项)放入 publish
文件夹中。然后这个文件夹可以直接与 microsoft/dotnet:<version>-core
图片一起使用。
我正在尝试构建 .NET Core 应用 docker 映像。但是我不知道应该如何将项目的 NuGet 依赖项添加到映像中。
为简单起见,我创建了一个 .NET Core 控制台应用程序:
using System;
using Newtonsoft.Json;
namespace ConsoleCoreTestApp
{
public class Program
{
public static void Main(string[] args)
{
Console.WriteLine($"Hello World: {JsonConvert.False}");
}
}
}
它只有一个 NuGet 依赖于 Newtonsoft.Json
。当我 运行 来自 Visual Studio 的应用程序时,一切正常。
但是,当我从项目创建 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'
这是意料之中的,因为 Newtonsoft.Json.dll
没有被 Visual Studio 复制到输出文件夹。
这是我正在使用的Dockerfile
:
FROM microsoft/dotnet:1.0.0-core
COPY bin/Debug /app
是否有处理此问题的推荐方法?
我不想 运行 dotnet restore
在容器内(因为我不想每次容器 运行 时都重新下载所有依赖项)。
我想我可以在 Dockerfile
中添加一个 RUN dotnet restore
条目,但是我不能再使用 microsoft/dotnet:<version>-core
作为基础图像了。
而且我找不到使 Visual Studio 将所有依赖项复制到输出文件夹中的方法(就像对常规 .NET Framework 项目所做的那样)。
我最近就此写了一篇tutorial。我使用的 Docker 文件内容是(稍微修改以删除 ASP.NET 核心位):
FROM microsoft/dotnet:latest
COPY . /app
WORKDIR /app
RUN ["dotnet", "restore"]
RUN ["dotnet", "build"]
ENTRYPOINT ["dotnet", "run"]
当您 运行 docker build
时,它使用 Docker 文件作为 "recipe" 来构建图像。它会先 运行 dotnet restore
和 dotnet build
, 然后 将所有内容打包到图像中。生成的图像包含应用在任何 Docker 主机上 运行 所需的一切。
经过更多阅读,我终于明白了。
而不是 dotnet build
你 运行:
dotnet publish
这会将所有文件(包括依赖项)放入 publish
文件夹中。然后这个文件夹可以直接与 microsoft/dotnet:<version>-core
图片一起使用。