2016-08-05 7 views
9

私は.NET Core appドッカー画像を作成しようとしています。しかし、どうやってプロジェクトのNuGet依存関係をイメージに取り込むのか分かりません。私は.NETのコアコンソールアプリケーションを作成しましたシンプルの理由.NET Core appドッカーのイメージに依存関係を含めるにはどうすればいいですか?

using System; 
using Newtonsoft.Json; 

namespace ConsoleCoreTestApp 
{ 
    public class Program 
    { 
     public static void Main(string[] args) 
     { 
      Console.WriteLine($"Hello World: {JsonConvert.False}"); 
     } 
    } 
} 

それはちょうどNewtonsoft.Jsonに1つのNuGet依存性を持っています。 Visual Studioからアプリケーションを実行すると、すべて正常に動作します。

私はプロジェクトからドッカーイメージを作成し、そこからアプリを実行しようとすると、しかし、それが依存関係を見つけることができません:Newtonsoft.Json.dllがコピーされていないので、

# 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で出力フォルダに移動します。

はここで私が使用しているDockerfileです:

FROM microsoft/dotnet:1.0.0-core 
COPY bin/Debug /app 

をこの問題に対処する推奨方法はありますか?

コンテナ内にdotnet restoreを実行したくありません(コンテナが動作するたびにすべての依存関係を再ダウンロードしたくないため)。

私はRUN dotnet restoreのエントリをDockerfileに追加することができましたが、をもう基本イメージとして使用できませんでした。

Visual Studioですべての依存関係を出力フォルダにコピーする方法が見つかりませんでした(通常の.NET Frameworkプロジェクトと同様)。

+0

私はネットの人ではないので、私の無知を許しています...なぜ、 'RUN dotnet restore 'を追加すると、あなたはドットネットベースイメージを使用できなくなりますか? – Matt

+0

@Mattは正しいですが、 'microsoft/dotnet'ベースイメージの使用を妨げてはいけません。 –

+0

@Mattコアイメージにrestoreコマンドが含まれていないためです。 –

答えて

13

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

代わりのdotnet buildあなたが実行します。

dotnet publish 

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

2

これは最近tutorialと書いてあります。私がした使用Dockerfile内容(少しASP.NETコア・ビットを削除するように変更):あなたがdocker buildを実行すると

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

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

ENTRYPOINT ["dotnet", "run"] 

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

+1

残念ながら、これは 'dotnet:xxx-core'イメージでは動作しません。しかし、dotnetとdotnet:xxx-coreの違いが基本イメージであるかどうかはわかりません。 –

+0

@SebastianKrysmanskiちょっと興味がありますが、なぜあなたは 'dotnet:latest'の代わりに' dotnet:xxx-core'を使いたいのですか? –

+1

特別な理由はありません。それは私にとって最も論理的な/最小の解決策に思えました。また、私はコンテナにソースコードを入れないようにしています。 –

関連する問題