Tengo una API .net core 2.1 detrás de un proxy inverso nginx que configuré usando docker compose en visual studio. Cuando se ejecuta, se puede acceder a la API (tengo un controlador de verificación de estado al que puedo llamar para verificar) pero no puedo depurar. Parece que mi solución no se está ejecutando después de la construcción. Pero mis contenedores están activos y accesibles. Estoy usando visual studio 2019.
Esta es mi estructura de carpetas:
estos son los archivos (de arriba a abajo en la estructura de carpetas):
Dockerfile (para la API):
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging. FROM mcr.microsoft.com/dotnet/core/aspnet:2.1-stretch-slim AS base WORKDIR /app #EXPOSE 80 FROM mcr.microsoft.com/dotnet/core/sdk:2.1-stretch AS build WORKDIR /src COPY ["RestApi/RestApi.csproj", "RestApi/"] COPY ["Services/Services.csproj", "Services/"] COPY ["DataServices/DataServices.csproj", "DataServices/"] COPY ["Entities/Entities.csproj", "Entities/"] RUN dotnet restore "RestApi/RestApi.csproj" COPY . . WORKDIR "/src/RestApi" RUN dotnet build "RestApi.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "RestApi.csproj" -c Release -o /app/publish FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENV ASPNETCORE_URLS http://+:5000 EXPOSE 5000 ENTRYPOINT ["dotnet", "RestApi.dll"]docker-compose.yml:
version: '2.1' services: restapi: build: context: ./ dockerfile: Dockerfile expose: - "5000" #restart: always reverseproxy: build: context: ./ReverseProxy dockerfile: Dockerfile ports: - "80:80" #restart: always links : - restapiDockerfile (proxy inverso):
FROM nginx COPY nginx.conf /etc/nginx/nginx.confnginx.conf:
worker_processes 4; events { worker_connections 1024; } http { sendfile on; upstream app_servers { server RestApi:5000; #server 172.17.0.1:5000; } server { listen 80; location / { proxy_pass http://app_servers; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $server_name; } } }Cuando se ejecuta docker-compose a través de Visual Studio, los contenedores de la ventana acoplable se crean correctamente, pero no puedo depurar y no se inicia ninguna pantalla del navegador. No recibo errores mientras construyo o ejecuto. Si necesita información adicional por favor pregunte.
Descubrí lo que estaba yendo mal. La respuesta es la solución a la pregunta publicada aquí. https://developercommunity.visualstudio.com/content/problem/552563/debugger-silently-fails-to-attach-to-docker-compos.html
Básicamente, cuando un dockerfile NO está junto a (junto a) el archivo csproj correspondiente (archivo de proyecto), Visual Studio no adjuntará el depurador. Esto es por diseño porque puede haber contenedores que desee iniciar pero que no desee depurar (proxy inverso, base de datos mysql, etc.). Entonces, cuando moví mi Dockerfile para la API dentro de la carpeta restapi (la misma carpeta que el archivo csproj) y ajusté mi docker-compose.yml para buscar un archivo docker dentro de esa carpeta, la depuración funcionó en Visual Studio.
Edit2: se lanzó el parche para Visual Studio (16.11.6+). Puede docker-compose enable-v2 ahora. Esta respuesta ahora está obsoleta.
Para los usuarios de Google aleatorios, hay un nuevo problema (octubre/noviembre de 2021) en docker-compose que rompió la depuración de Visual Studio 2019 (pero no la vista previa de VS2022) con casi los mismos síntomas que en esta pregunta.
La cuestión es que docker-compose config devolverá la ruta relativa a Build.Context y Build.Dockerfile (debe devolver la ruta absoluta en Build.Context y relativa en Build.Dockerfile )
La solución en este momento es docker-compose disable-v2 y Clean & Rebuild su solución hasta que se lance un nuevo parche de docker-compose o visual studio.
Para obtener más información, consulte https://github.com/microsoft/DockerTools/issues/311 y https://github.com/docker/compose/issues/8760
Editar:
La próxima actualización de VS es el 9 de noviembre [2021]. Tendrá la solución.
No estoy agregando esto como una solución a este problema, pero puede ayudar a otras personas.
Mi problema era, en resumen, un espacio en el nombre de mi solución.
Tengo una gran solución que se inició originalmente en VS Windows. Mi única suposición es que en Windows se le permite tener un espacio en el nombre del archivo de la solución. Así que el mío era como "Mi App.sln". No tuve problemas para ejecutar todo en VS Mac hasta que agregué compatibilidad con Docker para un proyecto.
La depuración de mi proyecto docker-compose haría todo como se esperaba, excepto iniciar la aplicación y adjuntar el depurador. Iniciaría bien el contenedor y se ejecutaría en el escritorio de la ventana acoplable. Si ejecutaba el punto de entrada manualmente en mi carpeta /app/bin, podía iniciar la aplicación y funcionaba. Entonces, dado que no había información de error, era difícil de diagnosticar.
Finalmente me molesté y solo traté de archivar un nuevo proyecto y agregué soporte para docker. Funcionó y se depuró bien. Luego probé con un espacio en el nombre de la solución y VS Mac dijo el carácter ilegal "de ninguna manera amigo" en el nombre. Entonces, me indicó que arreglara mi proyecto real.
Hubiera sido muy agradable si en algún lugar de las herramientas arrojara al menos una advertencia para un espacio (o cualquier carácter ilegal) que esté en la ruta o el nombre de archivo que impida que Docker funcione. Literalmente perdí más de 15 horas tratando de resolver esto.