.NETCoreアプリのDockerイメージを作成しようとしています。しかし、プロジェクトのNuGet依存関係をイメージに取り込む方法がわかりません。
簡単にするために、.NETCoreコンソールアプリケーションを作成しました。
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の依存関係は1つだけです。 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
がVisualStudioによって出力フォルダーにコピーされていないため、これは予想されることです。
これが私が使用しているDockerfile
です:
FROM Microsoft/dotnet:1.0.0-core
COPY bin/Debug /app
この問題に対処するための推奨される方法はありますか?
コンテナ内でdotnet restore
を実行したくありません(コンテナが実行されるたびにすべての依存関係を再ダウンロードしたくないため)。
RUN dotnet restore
エントリをDockerfile
に追加できたと思いますが、Microsoft/dotnet:<version>-core
をベースイメージとして使用できなくなりました。
また、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を「レシピ」として使用してイメージを構築します。最初にdotnet restore
とdotnet build
を実行し、次に次にすべてをイメージにパッケージ化します。結果のイメージには、アプリがDockerホストで実行するために必要なすべてのものが含まれています。