Fehler "getcwd () fehlgeschlagen: Keine solche Datei oder kein solches Verzeichnis" beim Versuch, VS in Docker auszuführen

8

Ich habe ein Projekt eingerichtet, das lokal in Docker mit Docker-Compose ausgeführt werden soll. Bis vor kurzem hat es gut funktioniert. Ich glaube nicht, dass ich etwas geändert habe, das dies beeinflussen könnte (außer vielleicht ein VS-Upgrade?), Und ich habe sogar versucht, auf ein älteres Commit zurückzugreifen. In allen Fällen wird jetzt eine Fehlermeldung angezeigt, die im Ausgabefenster von Visual Studio wie folgt angezeigt wird:

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

Ich habe verschiedene Dinge ausprobiert (Ändern des Basisabbilds in der Docker-Datei, Löschen alter Bilder und Container usw.), aber es wird immer wieder dieselbe Fehlermeldung angezeigt. Das Seltsame ist, dass Visual Studio beim Ausführen einer Datei-> Neu eine sehr ähnlich aussehende Docker-Datei generiert, die einwandfrei funktioniert. Ich habe keine Ahnung, wo das Problem liegt, aber ich hoffe, dass jemand hier es erkennen kann.

Mein vollständiges Repo ist auf Github verfügbar . Hier ist der Docker für das asp.net-Kernprojekt:

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"]

und das Docker-Compose für die Lösung (auch ohne das Couchbase-Zeug erhalte ich den gleichen Fehler, aber ich füge ihn der Vollständigkeit halber hier ein):

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
quelle
1
Ich habe mich letzte Nacht mit jemandem zusammengetan und von der Kommandozeile aus scheint alles in Ordnung zu sein. und alles funktionierte gut für ihn von Visual Studio. An diesem Punkt denke ich, dass das Wegblasen von Visual Studio eine Lösung sein könnte.
Matthew Groves
Ihr Repo ist nicht reproduzierbar. Es kommt zu einem Benutzerfehler. Dann Ausgabe Zertifikate. Ich konnte es nicht zum Laufen bringen. Warum sollte VS ein Problem sein? Ihr Code wird in einem Container ausgeführt.
Suren
Ich habe VS wegen dieser Pairing-Sitzung vermutet. Ich konnte Docker-Compose über die Befehlszeile ausführen und es schien in Ordnung zu funktionieren (und verursachte nicht den Fehler getcwd). Was meinst du mit "mein Repo ist nicht reproduzierbar"? Welchen Fehler hast du bekommen? Ich bekomme kein Zertifikat-Problem, mein Paar auch nicht. Ein "Benutzerfehler" (Ausnahme?) Kann daran liegen, dass Sie keine zuckenden Anmeldeinformationen eingegeben haben, was bedeutet, dass Sie nicht auf dasselbe Problem wie ich gestoßen sind.
Matthew Groves

Antworten:

3

Ich habe nicht genug Ruf, um einen Kommentar abzugeben, aber ich denke, es könnte Ihre .csproj-Datei sein. Sie haben erwähnt, dass Sie Visual Studio aktualisiert haben. Da die .csproj-Datei Informationen zum Projekt enthält (einschließlich Verweise auf Systemassemblys) und Sie diese in Ihre Docker-Datei kopieren, ist Folgendes möglich:

  1. Die .csproj-Datei muss aktualisiert werden, da Sie VS aktualisiert haben.
  2. Die Dotnet-Kernversion in Ihrer Docker-Datei "FROM" -Anweisung ist eine andere Version als die, die Sie lokal verwenden.

Testen Sie dies möglicherweise, indem Sie ein neues Projekt starten und Ihre Quelle hinzufügen, und führen Sie dann einen Unterschied zwischen den alten und neuen .csproj-Dateien durch. Sie können auch das Original sichern und versuchen, die .csproj-Datei manuell zu ändern. Ich habe einen Blog-Beitrag gefunden , der das Upgrade einer vs2015-csproj-Datei auf vs2017 demonstriert. Hoffentlich hilft es.

jaymac18
quelle
Mein VS-Upgrade war geringfügig: 16.4.3 bis 16.4.4. Ich glaube, ich habe ein neues Projekt und einen Diff ausprobiert, aber ich habe nichts bemerkt. Vielen Dank für Ihre Antwort, und es lohnt sich, es noch einmal zu versuchen.
Matthew Groves
1
@MatthewGroves Sorry, ich könnte nicht mehr helfen. Viel Glück.
jaymac18
1

Da ich nicht genug Ruf habe, kann ich Ihre Frage nicht kommentieren. Eine Sache, die mich verwundert, ist die Tatsache, dass Sie als Basis-Image ein Image verwenden, das kein .Net SDK enthält. Wenn Sie versuchen, einen Befehl auszuführen, für den ein SDK erforderlich ist, schlägt dies fehl

Ich gehe davon aus, dass im Container f93fb2962a1edas Bild verwendet wird, das von der Docker-Datei erstellt wurde, die Sie in der Frage gepostet haben

Stephane Moser
quelle
Ich bin nicht sehr tief in das Thema. Können Sie genauer erklären, wie Sie Ihr beschriebenes Problem lösen können?
Jonathan Stellwag
1

getcwd()Fehler bedeutet, dass die Lösung den Kontext zum Pfad verloren hat. Ich habe festgestellt, dass dock-composedas Problem durch vollständiges Entfernen der Lösung und der zugehörigen Dockerfile-Datei aus dem Projekt behoben wurde. Es ist hacky, funktioniert aber, wenn Sie in einer Bindung sind.

Laser Hawk
quelle
0

Ich glaube, dass Ihr aktuelles Arbeitsverzeichnis gelöscht wurde oder der Pfad zum Arbeitsverzeichnis zurückgesetzt wurde. Dies ist jedoch die erste Option, da durch die Aktualisierung von VS möglicherweise das Verzeichnis /tmpauf Ihrem Docker-Computer entfernt wurde, sodass es nicht mehr vorhanden ist, und es bei einem externen Ereignis erstellt wird.

Oder setzen Sie den Port auf Blockieren der Verbindung zu Ihrem Docker-Computer.

  1. Überprüfen Sie die Verbindung zum Docker-Computer
  2. Überprüfen Sie das Vorhandensein eines Ordners, der als Arbeitsverzeichnis auf dem Docker-Computer verwendet wird

Wenn Sie kein Problem gefunden haben, fahren Sie fort mit:

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

Sie können diesen offiziellen Docker- Debugging-Artikel damit verwenden. Folgen Sie den Verzeichnissen, in denen Docker versucht, auf ihre Existenz zuzugreifen und sie zu überprüfen.

Mit diesem Debugging sollten Sie in der Lage sein, Probleme zu entdecken.

Ich hoffe es hat dir geholfen

Jiri Otoupal い り お と う う る
quelle