2016-08-05 5 views
9

Ich versuche, ein Docker-Image für die .NET Core-App zu erstellen. Aber ich kann nicht herausfinden, wie ich die NuGet-Abhängigkeiten des Projekts in das Bild bekommen soll.Wie können Abhängigkeiten in das Docker-Image von .NET Core integriert werden?

Aus Gründen der Einfachheit habe ich eine .NET-Core-Konsolenanwendung erstellen:

using System; 
using Newtonsoft.Json; 

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

Es hat nur eine NuGet Abhängigkeit von Newtonsoft.Json. Wenn ich die App von Visual Studio aus starte, funktioniert alles einwandfrei.

Allerdings, wenn ich ein Docker Bild aus dem Projekt erstellen und versuchen, die App von dort auszuführen, kann es nicht die Abhängigkeit finden:

# 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' 

Dies ist zu erwarten, da Newtonsoft.Json.dll nicht kopiert wird von Visual Studio in den Ausgabeordner.

Hier ist die Dockerfile Ich verwende:

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

Gibt es eine empfohlene Weg, mit diesem Problem umzugehen?

Ich möchte dotnet restore innerhalb des Containers nicht ausführen (wie ich alle Abhängigkeiten nicht jedes Mal neu downloaden möchte, wenn der Container ausgeführt wird).

Ich denke, ich könnte einen RUN dotnet restore Eintrag zu Dockerfile hinzufügen, aber dann konnte ich microsoft/dotnet:<version>-core nicht mehr als Basisbild verwenden.

Und ich konnte keinen Weg finden, Visual Studio zu veranlassen, alle Abhängigkeiten in den Ausgabeordner zu kopieren (wie bei regulären .NET Framework-Projekten).

+0

Ich bin keine .net Person also verzeih meine Ignoranz ... Warum verhindert das Hinzufügen einer 'RUN dotnet restore' die Verwendung des dotnet Basisbildes? – Matt

+0

@Matt ist korrekt, es sollte Sie nicht daran hindern, das 'microsoft/dotnet'-Basisbild zu verwenden. –

+0

@Matt Da das Kern-Image nicht den Wiederherstellungsbefehl enthält. –

Antwort

13

Nach einigem Lesen habe ich es endlich herausgefunden.

Statt dotnet build Sie laufen:

dotnet publish 

Diese alle Dateien platzieren wird (einschließlich Abhängigkeiten) in einem publish Ordner. Und dieser Ordner kann dann direkt mit einem microsoft/dotnet:<version>-core Image verwendet werden.

2

Ich schrieb kürzlich eine tutorial. Die Dockerfile Inhalt I verwendet wurden (leicht die ASP.NET Bohrkronen entfernen modifiziert):

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

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

ENTRYPOINT ["dotnet", "run"] 

Wenn Sie docker build laufen, ist es die Dockerfile als „Rezept“ verwendet das Bild zu bauen. Es wird dotnet restore und dotnet build zuerst, dann Paket alles in das Bild. Das resultierende Bild enthält alles, was die App auf einem beliebigen Docker-Host ausführen muss.

+1

Leider funktioniert dies nicht mit einem 'dotnet: xxx-core' Bild.Ich bin mir aber nicht sicher, ob der Unterschied zwischen 'dotnet' und' dotnet: xxx-core' als Basisbild relevant ist. –

+0

@SebastianKrysmanski Nur neugierig, warum willst du 'dotnet: xxx-core' anstelle von' dotnet: neustes' verwenden? –

+1

Kein besonderer Grund. Es schien mir die logischste/minimale Lösung zu sein. Außerdem versuche ich, den Quellcode nicht in den Container zu legen. –

Verwandte Themen