Error "getcwd () falló: No existe tal archivo o directorio" al intentar ejecutar desde VS en Docker

8

Tengo un proyecto configurado para ejecutarse localmente en Docker con docker-compose. Hasta hace poco, ha estado funcionando bien. No creo que haya cambiado nada que pueda afectar esto (¿excepto quizás una actualización VS?), E incluso he intentado volver a una confirmación anterior. En todos los casos, ahora recibo un mensaje de error, que aparece en la ventana de salida de Visual Studio como:

docker exec -i f93fb2962a1e sh -c ""dotnet"  --additionalProbingPath /root/.nuget/packages --additionalProbingPath /root/.nuget/fallbackpackages  "bin/Debug/netcoreapp3.1/MattsTwitchBot.Web.dll" | tee /dev/console"
sh: 0: getcwd() failed: No such file or directory
  It was not possible to find any installed .NET Core SDKs
  Did you mean to run .NET Core SDK commands? Install a .NET Core SDK from:
      https://aka.ms/dotnet-download

He intentado una variedad de cosas diferentes (cambiar la imagen base en el archivo Docker, eliminar imágenes y contenedores antiguos, y más) pero sigo recibiendo el mismo mensaje de error. Lo extraño es que cuando hago un Archivo-> Nuevo, Visual Studio genera un archivo Docker de aspecto muy similar y funciona bien. No tengo idea de cuál es el problema, pero espero que alguien aquí pueda detectarlo.

Mi repositorio completo está disponible en Github . Aquí está la ventana acoplable para el proyecto principal asp.net:

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["MattsTwitchBot.Web/MattsTwitchBot.Web.csproj", "MattsTwitchBot.Web/"]
COPY ["MattsTwitchBot.Core/MattsTwitchBot.Core.csproj", "MattsTwitchBot.Core/"]
RUN dotnet restore "MattsTwitchBot.Web/MattsTwitchBot.Web.csproj"
COPY . .
WORKDIR "/src/MattsTwitchBot.Web"
RUN dotnet build "MattsTwitchBot.Web.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "MattsTwitchBot.Web.csproj" -c Release -o /app/publish

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

y el docker-compose para la solución (incluso sin las cosas de Couchbase obtengo el mismo error, pero lo estoy pegando aquí para completarlo):

version: '3.4'

services:
  couchbase:
    image: couchbase:6.5.0-beta2
    volumes:
    - "./couchbasetwitchbot:/opt/couchbase/var" # couchbase data folder
    ports:
    - "8091-8096:8091-8096" # https://docs.couchbase.com/server/current/install/install-ports.html
    - "11210-11211:11210-11211"
  mattstwitchbot.web:
    image: ${DOCKER_REGISTRY-}mattstwitchbotweb
    build:
      context: .
      dockerfile: MattsTwitchBot.Web/Dockerfile
    environment:
      Couchbase__Servers__0: http://couchbase:8091/ # Reference to the "couchbase" service name on line 4
    depends_on:
    - couchbase # Reference to the "couchbase" service name on line 4
    command: ["./wait-for-it.sh", "http://couchbase:8091"]
Matthew Groves
fuente
1
Me emparejé con alguien anoche y todo parece funcionar bien desde la línea de comando; y todo funcionó bien para él de Visual Studio. En este punto, creo que volar Visual Studio podría ser una solución.
Matthew Groves
Su repositorio no es reproducible. Viene con un error del usuario. Luego, expedición de certificados. No pude hacerlo funcionar. Ahora, ¿por qué VS sería un problema? Su código se ejecuta dentro de un contenedor.
Suren
Sospeché VS debido a esta sesión de emparejamiento. Pude ejecutar docker-compose desde la línea de comandos y pareció funcionar bien (y no causó el error getcwd). Cuando dices "mi repositorio no es reproducible", ¿qué quieres decir? ¿Qué error obtuvo? No estoy recibiendo un problema de certs, tampoco mi par. Un "error de usuario" (¿excepción?) Podría deberse a que no ingresó las credenciales de twitch, lo que significa que no se encontró con el mismo problema que yo.
Matthew Groves

Respuestas:

3

No tengo suficiente reputación para comentar, pero creo que podría ser su archivo .csproj. Usted mencionó que actualizó Visual Studio. Dado que el archivo .csproj contiene información sobre el proyecto (incluidas referencias a ensamblajes del sistema) y lo está copiando en su Dockerfile, es posible que:

  1. El archivo .csproj debe actualizarse desde que actualizó VS.
  2. La versión central de dotnet en su declaración 'FROM' del dockerfile es una versión diferente de la que está usando localmente.

Quizás pruebe esto comenzando un nuevo proyecto y agregando su fuente, luego haga una diferencia en los archivos .csproj viejos y nuevos. También puede hacer una copia de seguridad del original e intentar modificar el archivo .csproj manualmente. Encontré una publicación de blog que demuestra la actualización de un archivo csproj vs2015 a vs2017. Espero que ayude.

jaymac18
fuente
Mi actualización VS fue menor: 16.4.3 a 16.4.4. Creo que probé un nuevo proyecto y un diff, pero no noté nada. Gracias por su respuesta, y vale la pena intentarlo nuevamente.
Matthew Groves
1
@MatthewGroves Lo siento, no podría ser más ayuda. Buena suerte para ti.
jaymac18
1

Como no tengo suficiente reputación, no puedo comentar tu pregunta. Pero una cosa que me desconcierta es el hecho de que está utilizando como imagen base una imagen que no tiene .Net SDK y si intenta ejecutar un comando que requiere un SDK se ve que falla

Supongo que, en el contenedor, f93fb2962a1eestá utilizando la imagen creada por el archivo acoplable que publicó en la pregunta

Stephane Moser
fuente
No estoy en el tema muy profundo. ¿Puedes explicar más detalladamente cómo resolver tu problema descrito?
Jonathan Stellwag
1

getcwd()error, significa que la solución perdió contexto a la ruta. Descubrí que eliminar completamente la dock-composesolución y el archivo Dockerfile asociado del proyecto solucionó el problema. Es hacky pero funciona si estás en apuros.

Laser Hawk
fuente
0

Creo que su directorio de trabajo actual se eliminó o se restableció la ruta al directorio de trabajo. Pero será la primera opción porque la actualización de VS puede eliminar el directorio /tmpen su máquina acoplable, por lo que ya no está allí, y se creará en algún evento externo.

O configure el puerto para bloquear la conexión a su máquina acoplable.

  1. Verifique la conexión a la máquina acoplable
  2. Compruebe la existencia de una carpeta que se utiliza como directorio de trabajo en la máquina acoplable

Si no encontró el problema, continúe con esto:

docker exec --it {containerID} /bin/sh

puede usar este artículo oficial de depuración de acopladores con esto, siga los directorios a los que está intentando acceder el acoplador y verifique su existencia.

Con esta depuración deberías poder descubrir problemas.

Espero que te haya ayudado

Jiri Otoupal い り お と う ぱ る
fuente