2017-10-16 1 views
2

Ich habe eine einfache ASP.NET Core 2.0-Anwendung mit 2 Projekten in einer Lösung. Ein Projekt ist eine Klassenbibliothek (WorldLibrary.dll), auf die von der Webanwendung (WeatherWeb.dll) verwiesen wird.Wie docken Sie eine ASP.NET Core 2.0-Anwendung an?

Ich habe versucht, die Schritte hier folgen:

https://docs.docker.com/engine/examples/dotnetcore/

Das ist mein Dockerfile:

FROM microsoft/aspnetcore-build:2.0 AS build-env 
WORKDIR /app 

# Copy csproj and restore as distinct layers 
COPY *.csproj ./ 
RUN dotnet restore 

# Copy everything else and build 
COPY . ./ 
RUN dotnet publish -c Release -o out 

# Build runtime image 
FROM microsoft/aspnetcore:2.0 
WORKDIR /app 
COPY --from=build-env /app/out . 
ENTRYPOINT ["dotnet", "WeatherWeb.dll"] 

Aber es gibt ein Problem mit der referenzierten DLL. Ich erhalte die folgende Ausgabe von dem „Docker build“ Befehl:

C:\Users\olavt\source\repos\Weather\WeatherWeb>docker build -t weather . 
Sending build context to Docker daemon 6.398MB 
Step 1/10 : FROM microsoft/aspnetcore-build:2.0 AS build-env 
---> df4c9af52c86 
Step 2/10 : WORKDIR /app 
---> Using cache 
---> ae9d1b099da7 
Step 3/10 : COPY *.csproj ./ 
---> Using cache 
---> 2d9f3fba6470 
Step 4/10 : RUN dotnet restore 
---> Using cache 
---> 19af5fb355a3 
Step 5/10 : COPY . ./ 
---> 1704520a3ced 
Step 6/10 : RUN dotnet publish -c Release -o out 
---> Running in 7bcdf847e4dc 
/usr/share/dotnet/sdk/2.0.2/NuGet.targets(792,5): warning MSB3202: The project file "/WorldLibrary/WorldLibrary.csproj" was not found. [/app/WeatherWeb.csproj] 
Microsoft (R) Build Engine version 15.4.8.50001 for .NET Core 
Copyright (C) Microsoft Corporation. All rights reserved. 

/usr/share/dotnet/sdk/2.0.2/Microsoft.Common.CurrentVersion.targets(1768,5): warning : The referenced project '../WorldLibrary/WorldLibrary.csproj' does not exist. [/app/WeatherWeb.csproj] 
Controllers/Api/WeatherController.cs(6,7): error CS0246: The type or namespace name 'WorldLibrary' could not be found (are you missing a using directive or an assembly reference?) [/app/WeatherWeb.csproj] 
Controllers/WeatherController.cs(6,7): error CS0246: The type or namespace name 'WorldLibrary' could not be found (are you missing a using directive or an assembly reference?) [/app/WeatherWeb.csproj] 
Controllers/Api/WeatherController.cs(14,39): error CS0246: The type or namespace name 'Weather' could not be found (are you missing a using directive or an assembly reference?) [/app/WeatherWeb.csproj] 
The command '/bin/sh -c dotnet publish -c Release -o out' returned a non-zero code: 1 

C:\Users\olavt\source\repos\Weather\WeatherWeb> 

Wie soll ich richtig die referenzierte DLL korrekt kopiert?

+0

Die Projektvorlage * bereits * enthält die Option zum Hinzufügen von Docker-Unterstützung. Haben Sie es versucht –

+0

Sie können auch hinzufügen Docker-Unterstützung von der 'Project' menud,' Docker Support' –

Antwort

2

Bei ähnlichen Projekten müssen Sie dotnet restore und dotnet publish für Ihre Lösungsdatei ausführen und Ihre Docker-Datei auf die Lösungsebene stellen, damit Sie auf alle Projekte zugreifen können.

Grundsätzlich ist die einzige Änderung, müssen Sie in der Docker-Datei ist:

COPY *.sln ./ 
COPY ./your_proj1_folder/*.csproj ./your_proj1_folder/ 
COPY ./your_proj2_folder/*.csproj ./your_proj2_folder/ 
RUN dotnet restore 
1

Die ASP.NET-Core-Projektvorlagen eine Option enthalten Docker Unterstützung mit der Option zum Ziel Linux oder Windows Container hinzuzufügen.

Auch wenn Sie eine ASP.NET-Core-Web-Anwendung ohne Docker Unterstützung erstellen, können Sie es in ein vorhandenes Projekt aus dem Project > Docker Support Menü hinzufügen

Die erzeugten Dockerfile führt das Basisbild definiert, führt das Dotnet wiederherzustellen, bauen veröffentlichen, Stufen und erzeugt ein endgültiges Bild, das die Web-Anwendung ausgeführt wird:

FROM microsoft/aspnetcore:2.0 AS base 
WORKDIR /app 
EXPOSE 80 

FROM microsoft/aspnetcore-build:2.0 AS build 
WORKDIR /src 
COPY *.sln ./ 
COPY WebApplication1/WebApplication1.csproj WebApplication1/ 
RUN dotnet restore 
COPY . . 
WORKDIR /src/WebApplication1 
RUN dotnet build -c Release -o /app 

FROM build AS publish 
RUN dotnet publish -c Release -o /app 

FROM base AS final 
WORKDIR /app 
COPY --from=publish /app . 
ENTRYPOINT ["dotnet", "WebApplication1.dll"] 

Es erzeugt auch eine docker-compose.yml-Datei, die die Bereitstellung imagesyou wünschen beschreibt. In diesem Fall habe ich zwei Web-Anwendungen hinzugefügt. Die erste wurde mit Docker-Unterstützung erstellt. In der zweiten wurde die Docker-Unterstützung nachträglich hinzugefügt. Die docker-compose.yml Datei enthält beide:

version: '3' 

services: 
    webapplication1: 
    image: webapplication1 
    build: 
     context: . 
     dockerfile: WebApplication1\Dockerfile 

    webapplication2: 
    image: webapplication2 
    build: 
     context: . 
     dockerfile: WebApplication2\Dockerfile 
+0

Wow, vielen Dank. Genau das, was ich brauche! –

Verwandte Themen