web-dev-qa-db-ja.com

.NET CoreアプリのDockerイメージに依存関係を含める方法は?

.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プロジェクトの場合と同様)。

11

もう少し読んだ後、私はついにそれを理解しました。

dotnet buildの代わりに、次のコマンドを実行します。

dotnet publish

これにより、すべてのファイル(依存関係を含む)がpublishフォルダーに配置されます。そして、このフォルダはMicrosoft/dotnet:<version>-coreイメージで直接使用できます。

19

私は最近これに チュートリアル を書きました。私が使用したDockerfileの内容は(ASP.NETコアビットを削除するためにわずかに変更されました):

FROM Microsoft/dotnet:latest
COPY . /app
WORKDIR /app

RUN ["dotnet", "restore"]
RUN ["dotnet", "build"]

ENTRYPOINT ["dotnet", "run"]

docker buildを実行すると、Dockerfileを「レシピ」として使用してイメージを構築します。最初にdotnet restoredotnet buildを実行し、次に次にすべてをイメージにパッケージ化します。結果のイメージには、アプリがDockerホストで実行するために必要なすべてのものが含まれています。

3
Nate Barbettini