Docker: Laufwerk wurde nicht freigegeben

15

Beim "Andocken" einer ASP.NET Core 3.1 MVC- Anwendung wurde das folgende Ergebnis erzielt :

docker run -dt -v "C:\Users\admin\vsdbg\vs2017u5:/remote_debugger:rw" -v "D:\xxx\yyy\Spikes\DockerizedWebApp1\DockerizedWebApp1:/app" -v "D:\xxx\yyy\Spikes\DockerizedWebApp1:/src/" -v "C:\Users\admin\.nuget\packages\:/root/.nuget/fallbackpackages2" -v "C:\Program Files\dotnet\sdk\NuGetFallbackFolder:/root/.nuget/fallbackpackages" -e "DOTNET_USE_POLLING_FILE_WATCHER=1" -e "ASPNETCORE_LOGGING__CONSOLE__DISABLECOLORS=true" -e "ASPNETCORE_ENVIRONMENT=Development" -e "NUGET_PACKAGES=/root/.nuget/fallbackpackages2" -e "NUGET_FALLBACK_PACKAGES=/root/.nuget/fallbackpackages;/root/.nuget/fallbackpackages2" -P --name DockerizedWebApp1 --entrypoint tail dockerizedwebapp1:dev -f /dev/null
docker: Error response from daemon: status code not OK but 500: {"Message":"Unhandled exception: Drive has not been shared"}.
See 'docker run --help'.
C:\Users\admin\.nuget\packages\microsoft.visualstudio.azure.containers.tools.targets\1.10.6\build\Container.targets(198,5): error CTC1015: Docker command failed with exit code 125.
C:\Users\admin\.nuget\packages\microsoft.visualstudio.azure.containers.tools.targets\1.10.6\build\Container.targets(198,5): error CTC1015: docker: Error response from daemon: status code not OK but 500: {"Message":"Unhandled exception: Drive has not been shared"}.
C:\Users\admin\.nuget\packages\microsoft.visualstudio.azure.containers.tools.targets\1.10.6\build\Container.targets(198,5): error CTC1015: See 'docker run --help'.
C:\Users\admin\.nuget\packages\microsoft.visualstudio.azure.containers.tools.targets\1.10.6\build\Container.targets(198,5): error CTC1015: If the error persists, try restarting Docker Desktop.

Unnötig zu erwähnen , dass ' docker run --help ' überhaupt nicht geholfen hat (fehlende Links / Anker in den Docker-Dokumenten usw.).

Einige zusätzliche Informationen:

  • Anwendung ist das VS2019-Gerüst ohne Modifikationen .
  • Docker-Image ist Linux ( welches ich nicht sagen kann ).
  • Docker-Version ist 19.03.5, Build 633a0ea

Da ich mit Linux nicht vertraut bin, stellt sich dieser Fehler für mich als "Show-Stopper" heraus. Vielleicht wird Linux nicht angewiesen, ein Laufwerk zu mounten? Aber welcher? Die Nachricht sagt es nicht ...

Möglicherweise muss Windows ein Laufwerk freigeben oder einen Ordner einem Laufwerk zuordnen, das freigegeben werden muss? Die Nachricht sagt dies auch nicht ...

Hier ist ein Screenshot des Docker-Dashboards:

Geben Sie hier die Bildbeschreibung ein

Und hier ist die Docker-Datei:

#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:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80

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

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

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "DockerizedWebApp1.dl"]

Jede Hilfe wäre sehr dankbar. Danke im Voraus!

Alexander Christov
quelle

Antworten:

15

Der Docker-Ausführungsbefehl enthält Volumes vom Laufwerk C, z -v "C:\Users\admin\vsdbg\vs2017u5:/remote_debugger:rw". Damit dies funktioniert, müssen Sie das Laufwerk C in Ihre freigegebenen Laufwerke aufnehmen (aktivieren Sie das Kontrollkästchen unter Einstellungen -> Ressourcen -> Dateifreigabe). Sie können die freizugebenden Dateien auch auf das Laufwerk D verschieben, das bereits für die eingebettete VM freigegeben ist. Dies ist in diesem Fall jedoch wahrscheinlich keine Option. Um zu wissen, welche Laufwerke freigegeben werden sollen, überprüfen Sie die Laufwerke, die in Volume-Bereitstellungen verwendet werden, im Befehl run.

In früheren Versionen von Docker für Windows war dies im Hintergrund erfolgreich und es wurde ein leerer Ordner in den Container eingefügt. Der Fehler, der Benutzer auffordert, zuerst die freigegebenen Laufwerke zu überprüfen, ist eine nette Verbesserung.

BMitch
quelle
C: ist mein Boot-Laufwerk und das Betriebssystem ist darauf installiert. Halten Sie es wirklich für eine gute Praxis, solche sensiblen Informationen weiterzugeben?
Alexander Christov
@AlexanderChristov Das Laufwerk wird für die eingebettete VM freigegeben, sodass Sie Verzeichnisse daraus in den Container einbinden können. Sie können nicht sagen, dass Sie das Laufwerk nicht freigeben möchten, während Sie gleichzeitig Befehle ausführen möchten, die Zugriff auf Verzeichnisse auf diesem Laufwerk erfordern. Dies ist kein Docker-Problem. Dies ist ein Problem mit dem Befehl, den Docker ausführen soll.
BMitch
immer noch "Siehe 'docker run --help'." ist ziemlich nutzlos. In der Tat ist es etwas schädlich, da es zu einer reinen Zeitverschwendung führt, die, wie Sie sehen können, dazu führte, die Frage zu stellen. trotzdem danke.
Alexander Christov
@AlexanderChristov ist eine generische Nachricht für jeden fehlgeschlagenen Befehl, mit der Sie wissen, welcher Hilfetext für Unterbefehle relevant sein kann. Ich bin mir nicht sicher, wie ich das anpassen soll, um alle möglichen Fehlerzustände abzudecken. Die 500: {"Message":"Unhandled exception: Drive has not been shared"}Meldung, die den Fehler ausgelöst hat, ist der nützliche Teil.
BMitch
Sehen Sie hier, wo / wann sie diese --helpEingabeaufforderung generieren : github.com/moby/moby/blob/…
BMitch
8

Durch die Bereitstellung von Laufwerk C: für Docker-Container über das Docker-Dashboard wurde das Problem behoben . Sehen Sie sich das Bild noch einmal an, in dem es nicht überprüft wurde.

Ein paar Kommentare müssen jedoch meiner Meinung nach geteilt werden.

  • Die Fehlermeldung war nicht klar, welches Laufwerk freigegeben werden musste (Linux unterstützt vermutlich mehr als ein einzelnes Laufwerk ).
  • Wenn Docker nicht verfügbar wäre, ohne Laufwerk C: verfügbar zu machen (oder das bootfähige Laufwerk, auf dem sich das Betriebssystem befindet) , warum hat es nach der Installation das Laufwerk selbst nicht überprüft? Dies ist nur ein Klick ( !! ) im Docker-Dashboard, daher sollte es (relativ) einfach sein.

Es kann eine sehr einfache Erklärung dafür geben, warum diese ziemlich nutzlose Meldung angezeigt wurde: Linux-Entwickler geben viel (CLI!) Ein und sind nicht sehr zufrieden damit. Sie geben nicht genug ein, um ihren Benutzern eine aussagekräftige Diagnose zu geben.

Nun, ich glaube, ich habe nicht Recht, aber es muss dennoch eine Erklärung geben, warum eine so große Auslassung in einem Endprodukt auftritt.

Alexander Christov
quelle
Außerdem ist Docker voll funktionsfähig, ohne dass dieses Laufwerk überprüft wird, solange Sie nicht versuchen, ein Verzeichnis aus Ihrem lokalen Dateisystem zu binden. Das einzige ist, dass sie die von Ihnen festgelegten Richtlinien befolgen und nicht für Sie festlegen möchten. (Stellen Sie sich vor, Sie führen blind ein Skript aus, das c: \ windows in den Container einbindet, und sind dann überrascht, wenn Sie feststellen, dass die Hashes Ihres SAM-Kontos geknackt sind. Dies war nur zulässig, weil sie dieses Kontrollkästchen "hilfreich" aktiviert haben, um Laufwerk C freizugeben, und dies nicht getan haben.
Ich
1

Ziehen Sie den langen Befehl "docker run ... / dev / null" aus der Ausgabe und führen Sie ihn selbst an einer Docker-fähigen Eingabeaufforderung aus. Der Docker-Desktop sollte dann auffordern, die Freigabe / den Netzwerkzugriff zuzulassen. Möglicherweise möchten Sie die Docker Desktop-App vorher neu starten.

Daryl
quelle