2017-10-26 117 views
6

Mam kilka projektów i muszą one być uruchomione w oddzielnych kontenerach, a ja mam pewne wspólne biblioteki, które powinny być również buit. Znalazłem następujące article, jak to zrobić. pokażę plik Döcker tylko dla jednego projektu, ponieważ są one dość taka sama:Docker: aplikacje działają poprawnie za pomocą dokera-compose up, ale jak uruchomić go za pomocą Visual Studio i debugowania?

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

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

FROM builder AS publish 
RUN dotnet publish -c Debug -o /app 

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

Więc, jak widać budynek wielostopniowa jest używany. jeśli używam docker-compose up, wszystko działa dobrze. Następnie próbuję uruchomić go za pomocą Visual Studio, widzę wszystkie etapy Output okna, ale w końcu pojawia się następujący błąd:

The target process exited without raising a CoreCLR started event. Ensure that the target process is configured to use .NET Core. This may be expected if the target process did not run on .NET Core. The program '[13] dotnet' has exited with code 145 (0x91). The program '' has exited with code 145 (0x91).

Ale jak debugować aplikację teraz? To jest link do github repo.

PS. Dla Tarun, domyślny plik doker że VS generuje

FROM microsoft/aspnetcore:2.0 
ARG source 
WORKDIR /app 
EXPOSE 80 
COPY ${source:-obj/Docker/publish} . 
ENTRYPOINT ["dotnet", "Web.dll"] 
+0

Jest to najprawdopodobniej dlatego, że Visual Studio ma dodatkowy plik Compose, który jest ładowany. Sprawdź, czy oba są w konflikcie z biegiem w twoim przypadku. Byłby to "docker-compose.ci.build.yml" –

+0

@ TarunLalwani. Próbowałem usunąć plik '... ci.build.yml', ale nic nie zasmuciło się. – user348173

+0

Więc jeśli nie używasz wieloetapowego pliku docker, to działa? –

Odpowiedz

8

TL; DR;

Tak więc zainstalowałem VS 2017 i miałem do tego dostęp, aby zrozumieć, co tu się dzieje. Po obejrzeniu procesu budowania swojego projektu znalazłem poniżej

docker-compose -f "C:\Users\tarlabs\Desktop\AspNetCoreMultiProject\docker-compose.yml" -f "C:\Users\tarlabs\Desktop\AspNetCoreMultiProject\docker-compose.override.yml" -f "C:\Users\tarlabs\Desktop\AspNetCoreMultiProject\obj\Docker\docker-compose.vs.debug.g.yml" -p dockercompose15184637154516733497 kill

doker-compose.override.yml

version: '3' 

services: 
    web: 
    environment: 
     - ASPNETCORE_ENVIRONMENT=Development 
    ports: 
     - "80" 

    api: 
    environment: 
     - ASPNETCORE_ENVIRONMENT=Development 
    ports: 
     - "80" 

co nie jest dużo zainteresowania.

doker-compose.vs.debug.g.yml

version: '3' 

services: 
    api: 
    image: api:dev 
    build: 
     args: 
     source: obj/Docker/empty/ 
    environment: 
     - DOTNET_USE_POLLING_FILE_WATCHER=1 
     - NUGET_FALLBACK_PACKAGES=/root/.nuget/fallbackpackages 
    volumes: 
     - C:\Users\tarlabs\Desktop\AspNetCoreMultiProject:/app 
     - C:\Users\tarlabs\vsdbg:/remote_debugger:ro 
     - C:\Users\tarlabs\.nuget\packages\:/root/.nuget/packages:ro 
     - C:\Program Files\dotnet\sdk\NuGetFallbackFolder:/root/.nuget/fallbackpackages:ro 

    entrypoint: tail -f /dev/null 
    labels: 
     com.microsoft.visualstudio.debuggee.program: "dotnet" 
     com.microsoft.visualstudio.debuggee.arguments: " --additionalProbingPath /root/.nuget/packages --additionalProbingPath /root/.nuget/fallbackpackages bin/Debug/netcoreapp2.0/Api.dll" 
     com.microsoft.visualstudio.debuggee.workingdirectory: "/app" 
     com.microsoft.visualstudio.debuggee.killprogram: "/bin/bash -c \"if PID=$$(pidof -x dotnet); then kill $$PID; fi\"" 

    web: 
    image: web:dev 
    build: 
     args: 
     source: obj/Docker/empty/ 
    environment: 
     - DOTNET_USE_POLLING_FILE_WATCHER=1 
     - NUGET_FALLBACK_PACKAGES=/root/.nuget/fallbackpackages 
    volumes: 
     - C:\Users\tarlabs\Desktop\AspNetCoreMultiProject:/app 
     - C:\Users\tarlabs\vsdbg:/remote_debugger:ro 
     - C:\Users\tarlabs\.nuget\packages\:/root/.nuget/packages:ro 
     - C:\Program Files\dotnet\sdk\NuGetFallbackFolder:/root/.nuget/fallbackpackages:ro 

    entrypoint: tail -f /dev/null 
    labels: 
     com.microsoft.visualstudio.debuggee.program: "dotnet" 
     com.microsoft.visualstudio.debuggee.arguments: " --additionalProbingPath /root/.nuget/packages --additionalProbingPath /root/.nuget/fallbackpackages bin/Debug/netcoreapp2.0/Web.dll" 
     com.microsoft.visualstudio.debuggee.workingdirectory: "/app" 
     com.microsoft.visualstudio.debuggee.killprogram: "/bin/bash -c \"if PID=$$(pidof -x dotnet); then kill $$PID; fi\"" 

Kilka ciekawych rzeczy

  • ENTRYPOINT definiujemy nie będzie różnicy w czasie debugowania gdyż przesłonięte przez VS z wartością: tail -f /dev/null
  • Wartość bin/Debug/netcoreapp2.0/Web.dll
  • wynosi
  • Katalog roboczy do debugowania jest zawsze ustawiony na /app użyciu com.microsoft.visualstudio.debuggee.workingdirectory
  • zamontować Volume C:\Users\tarlabs\Desktop\AspNetCoreMultiProject:/app

Patrząc na woluminów C:\Users\tarlabs\Desktop\AspNetCoreMultiProject:/app, byłem jak Wow! Wszystko, co masz w folderze /app w pliku Dockerfile, zostanie tylko przesłonięte przez ten uchwyt. Więc niezależnie od tego, czy skompilujesz i umieścisz pliki w tym, czy nie zrobisz nic, nie zrobisz różnicy.

Teraz poszedłem wewnątrz pojemnika i zrozumiał, że Web.dll jest insider /app/Web/bin/Debug/netcoreapp2.0/Web.dll ale debugger jest spodziewałem się, że na /app/bin/Debug/netcoreapp2.0/Web.dll. Po przejrzeniu wszystkich ustawień nigdzie nie mogłem znaleźć tej ścieżki.

Potem grałem z nowym projektem. Dodanie jednego projektu z obsługą Docker i później dodanie innego projektu z obsługą dockera.To dało mi wskazówkę jak docker-compose.yml był

version: '3' 

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

    webapplication2: 
    image: webapplication2 
    build: 
     context: ./../WebApplication2 
     dockerfile: Dockerfile 

ten dał mi wskazówkę, że dynamiczny docker-compose.vs.debug.g.yml plik ma woluminów na podstawie kontekstu podanej w swojej docker-compose.yml. Teraz patrząc na twój projekt.

doker-compose.yml

version: '3' 

services: 
    web: 
    image: web 
    build: 
     context: . 
     dockerfile: Web/Dockerfile 

    api: 
    image:api 
    build: 
     context: . 
     dockerfile: Api/Dockerfile 

Ponieważ kontekst jest . Volume Górze jest generowany jako

- C:\Users\tarlabs\Desktop\AspNetCoreMultiProject:/app 

Aby poprawić że aktualizujemy nasze docker-compose.yml do

version: '3' 

services: 
    web: 
    image: web 
    build: 
     context: ./Web 
     dockerfile: Dockerfile 

    api: 
    image:api 
    build: 
     context: ./Api 
     dockerfile: Dockerfile 

Następny nasz Docke rfile robił zbyt wiele rzeczy, których typ debuggera VS po prostu ignoruje. Więc po prostu potrzebuje 2 linie w Dockerfile do debugowania, aby faktycznie pracują

FROM microsoft/aspnetcore:2.0 AS base 
WORKDIR /app 

Rest wszystko, co nie było po prostu wyrzucane przez objętość zamontować. Nie ma sensu robić tego w celu debugowania. Możesz użyć podejścia wielostopniowego do wdrożenia, ale nie do debugowania. Po wykonaniu tych dwóch zmian w swoim debugowania Projekt rozpoczął pracę dla mnie

Debugging Working

+0

Dziękuję za wspaniałe badania. – user348173

0

miałem dokładnie ten sam budynek emisyjnej .Net 2.0 aplikacji dla systemu Linux. Wypróbowałem wszystkie powyższe kroki i to nie pomogło. Problem polegał na tym, że użyłem spacji w nazwach plików csproj i katalogach projektów.

Po usunięciu spacji został rozwiązany problem. Próbowałem utworzyć .NET Core Application o nazwie "WebApplication 1", ale również się nie udało, więc wygląda na błąd w narzędziach VS lub plikach dokowania/tworzeniu plików, które tworzy.