J'ai plusieurs projets et ils doivent être exécutés dans des conteneurs séparés, et j'ai une bibliothèque partagée qui devrait également être conçue. J'ai trouvé le article suivant comment le faire. Je montrerai le fichier docker pour un seul projet, car ils sont pratiquement identiques:
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"]
Donc, comme vous pouvez le voir, on utilise un bâtiment à plusieurs étages. si j'utilise docker-compose up
alors tout va bien. Ensuite, j'essaie de l'exécuter via Visual Studio, toutes les étapes sont affichées dans la fenêtre Output
, mais le message d'erreur suivant s'affiche:
Le processus cible s'est arrêté sans déclencher un événement lancé par CoreCLR. Assurez-vous que le processus cible est configuré pour utiliser .NET Core. Cela peut être attendu si le processus cible ne s'est pas exécuté sur .NET Core. Le programme '[13] dotnet' s'est terminé avec le code 145 (0x91). Le programme '' s'est terminé avec le code 145 (0x91).
Mais comment déboguer l'application maintenant? C'est le lien vers github repo .
PS Pour Tarun, fichier fixe par défaut généré par le VS
FROM Microsoft/aspnetcore:2.0
ARG source
WORKDIR /app
EXPOSE 80
COPY ${source:-obj/Docker/publish} .
ENTRYPOINT ["dotnet", "Web.dll"]
TL; DR;
J'ai donc installé VS 2017 et eu un Dig à cela pour comprendre ce qui se passe ici. Après avoir examiné le processus de construction de votre projet, j'ai trouvé ci-dessous
docker-compose -f "C:\Utilisateurs\tarlabs\Bureau\AspNetCoreMultiProject\docker-composition.yml" -f "C:\Utilisateurs\tarlabs\Bureau\AspNetCoreMultiProject\docker-compose.override.yml" -f "C:\Users\tarlabs\Desktop\AspNetCoreMultiProject\obj\Docker\docker-compose.vs.debug.g.yml "-p dockercompose15184637154516733497 kill
docker-compose.override.yml
version: '3'
services:
web:
environment:
- ASPNETCORE_ENVIRONMENT=Development
ports:
- "80"
api:
environment:
- ASPNETCORE_ENVIRONMENT=Development
ports:
- "80"
Ce qui n'est pas très intéressant.
docker-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\""
Peu de choses intéressantes
ENTRYPOINT
que nous définissons ne fera aucune différence pendant le débogage car elle est remplacée par le VS avec tail -f /dev/null
com.Microsoft.visualstudio.debuggee.arguments
a une valeur avec le chemin bin/Debug/netcoreapp2.0/Web.dll
/app
à l'aide de com.Microsoft.visualstudio.debuggee.workingdirectory
C:\Users\tarlabs\Desktop\AspNetCoreMultiProject:/app
En regardant Volume mount C:\Users\tarlabs\Desktop\AspNetCoreMultiProject:/app
, j'étais comme Wow! Tout ce que vous avez dans votre dossier /app
dans votre fichier Docker sera simplement remplacé par ce montage. Donc, si vous construisez et mettez les fichiers à l'intérieur ou si vous ne faites rien, cela ne fera aucune différence.
Maintenant, je suis entré dans le conteneur et je me suis rendu compte que le Web.dll
est un initié /app/Web/bin/Debug/netcoreapp2.0/Web.dll
mais que le débogueur s'attend à ce qu'il soit sur /app/bin/Debug/netcoreapp2.0/Web.dll
. Après avoir cherché dans tous les contextes, je ne pouvais trouver ce chemin nulle part
Ensuite, j'ai joué avec un nouveau projet. Ajout d'un projet avec le support Docker et ajout ultérieur d'un autre projet avec le support Docker. Cela m'a donné un indice que le docker-compose.yml
était
version: '3'
services:
webapplication1:
image: webapplication1
build:
context: ./WebApplication1
dockerfile:Dockerfile
webapplication2:
image: webapplication2
build:
context: ./../WebApplication2
dockerfile: Dockerfile
Cela m'a laissé entendre que le fichier docker-compose.vs.debug.g.yml
dynamique prend le montage de volume en fonction du contexte donné dans votre docker-compose.yml
. Regardons maintenant votre projet.
docker-compose.yml
version: '3'
services:
web:
image: web
build:
context: .
dockerfile: Web/Dockerfile
api:
image:api
build:
context: .
dockerfile: Api/Dockerfile
Puisque le contexte est .
, le montage en volume est généré comme suit:
- C:\Users\tarlabs\Desktop\AspNetCoreMultiProject:/app
Pour corriger cela, nous mettons à jour notre docker-compose.yml
en
version: '3'
services:
web:
image: web
build:
context: ./Web
dockerfile: Dockerfile
api:
image:api
build:
context: ./Api
dockerfile: Dockerfile
Ensuite, notre fichier Dockerfile faisait trop de choses que le débogueur VS ignore en quelque sorte. Donc, vous avez juste besoin de 2 lignes dans votre Dockerfile
pour que le débogage fonctionne réellement
FROM Microsoft/aspnetcore:2.0 AS base
WORKDIR /app
Reste que tout ce que vous avez fait a été jeté par le support de volume. Donc, inutile de faire cela pour le débogage. Vous pouvez utiliser une approche de construction en plusieurs étapes pour le déploiement en production, mais pas pour le débogage. Après avoir effectué ces deux modifications dans votre projet, le débogage a commencé à fonctionner pour moi
J'ai eu exactement le même problème lors de la création de .Net 2.0 App pour Linux. J'ai essayé toutes les étapes ci-dessus et cela n'a pas aidé. Le problème pour moi était que j'avais utilisé des espaces dans les noms de fichiers csproj et les répertoires de projets.
Lorsque j'ai supprimé les espaces, le problème a été résolu. J'ai essayé de créer une application .Net Core appelée "WebApplication 1" et elle a également échoué. Cela ressemble donc à un bogue dans l'outil VS ou dans le fichier docker/les fichiers composés qu'il crée.
Avait le même problème en raison d'un symbole Sharp (#
) dans mon chemin de projet (comme en C # ... comme C:\Project\C#\MyProject\
).
Suppression du symbole pointu du chemin (C:\Project\C-sharp\MyProject\
) et j'étais prêt à partir.