Erro "getcwd () falhou: não existe esse arquivo ou diretório" ao tentar executar a partir do VS no Docker

8

Eu tenho um projeto configurado para ser executado localmente no Docker com docker-compose. Até recentemente, estava funcionando bem. Não acredito que mudei nada que devesse afetar isso (exceto talvez uma atualização do VS?) E tentei reverter para um commit mais antigo. Em todos os casos, agora estou recebendo uma mensagem de erro, que aparece na janela de saída do 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

Eu tentei várias coisas diferentes (alterar a imagem base no arquivo Docker, excluir imagens e contêineres antigos e muito mais), mas continuo recebendo a mesma mensagem de erro. O estranho é que, quando eu faço um Arquivo-> Novo, o Visual Studio gera um arquivo Docker com aparência muito semelhante e funciona bem. Não tenho idéia de qual é o problema, mas espero que alguém aqui possa identificá-lo.

Meu repositório completo está disponível no Github . Aqui está a janela de encaixe para o projeto principal do 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"]

e o docker-compondo para a solução (mesmo sem o material do Couchbase, estou recebendo o mesmo erro, mas o colo aqui para garantir a integridade):

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
fonte
1
Fiz uma parceria com alguém ontem à noite e tudo parece funcionar bem na linha de comando; e tudo funcionou bem para ele no Visual Studio. Neste ponto, acho que afastar o Visual Studio pode ser uma solução.
Matthew Groves
seu repo não é reproduzível. Ele aparece com um erro do usuário. Em seguida, a emissão de certificados. Não fui capaz de fazê-lo funcionar. Agora, por que o VS seria um problema? Seu código é executado dentro de um contêiner.
suren 6/02
Suspeitei de VS por causa dessa sessão de emparelhamento. Consegui executar o docker-compose na linha de comando e ele parecia funcionar bem (e não causou o erro getcwd). Quando você diz "meu repo não é reproduzível", o que você quer dizer? Que erro você obteve? Eu não estou tendo um problema certeiro, nem meu par. Um "erro de usuário" (exceção?) Pode ser porque você não inseriu credenciais de contração, o que significa que você não encontrou o mesmo problema que eu.
Matthew Groves

Respostas:

3

Não tenho reputação suficiente para comentar, mas acho que pode ser o seu arquivo .csproj. Você mencionou que atualizou o Visual Studio. Como o arquivo .csproj contém informações sobre o projeto (incluindo referências aos assemblies do sistema) e você está copiando-o no Dockerfile, é possível que:

  1. O arquivo .csproj precisa ser atualizado desde que você atualizou o VS.
  2. A versão principal do dotnet na instrução 'FROM' do arquivo docker é uma versão diferente da que você está usando localmente.

Talvez teste isso iniciando um novo projeto e adicionando sua fonte, depois faça uma diferença nos arquivos .csproj antigos e novos. Você também pode fazer backup do original e tentar modificar o arquivo .csproj manualmente. Encontrei uma postagem no blog que demonstra a atualização de um arquivo csproj vs2015 para vs2017. Espero que ajude.

jaymac18
fonte
Minha atualização do VS foi menor: 16.4.3 a 16.4.4. Acredito que tentei um novo projeto e um diff, mas não percebi nada. Obrigado pela sua resposta, e vale a pena tentar novamente.
Matthew Groves
1
@MatthewGroves Desculpe, não pude ajudar mais. Boa sorte para você.
jaymac18
1

Como não tenho reputação suficiente, não posso comentar sua pergunta. Mas uma coisa que me intriga é o fato de você estar usando como imagem base uma imagem que não possui .Net SDK e, se você tentar executar um comando que exija um SDK, ele falhará.

Suponho que, no contêiner, f93fb2962a1eesteja usando a imagem criada pelo arquivo docker que você postou na pergunta

Stephane Moser
fonte
Eu não estou no tópico muito profundo. Você pode explicar mais detalhadamente como resolver o problema descrito?
Jonathan Stellwag
1

getcwd()erro, significa que a solução perdeu o contexto para o caminho. Descobri que remover completamente a dock-composesolução e o arquivo Dockerfile associado do projeto corrigiu o problema. É hacky, mas funciona se você estiver em dificuldades.

Laser Hawk
fonte
0

Eu acredito que seu diretório de trabalho atual foi excluído ou o caminho para o diretório de trabalho foi redefinido. Mas será a primeira opção, porque a atualização do VS pode remover o diretório /tmpda máquina docker, de modo que não existe mais e será criada em algum evento externo.

Ou defina a porta para bloquear a conexão com sua máquina docker.

  1. Verifique a conexão com a docker machine
  2. Verifique a existência da pasta usada como diretório ativo na máquina docker

Se você não encontrou um problema, continue com isso:

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

você pode usar este artigo oficial de depuração do docker com isso, siga os diretórios que o docker está tentando acessar e verifique a existência deles.

Com essa depuração, você deve descobrir problemas.

Espero que tenha ajudado

Jiri Otoupal adicionou uma nova foto
fonte