Docker: la unidad no se ha compartido

15

Al "dockerizar" una aplicación ASP.NET Core 3.1 MVC obtuve el siguiente resultado:

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.

No hace falta decir que ' docker run --help ' no ayudó en absoluto (faltan enlaces / anclajes en los documentos de Docker, etc.).

Alguna información adicional:

  • La aplicación es lo que andamios VS2019 sin ninguna modificación .
  • La imagen de Docker es Linux ( cuál no puedo decir ).
  • La versión de Docker es 19.03.5, compilación 633a0ea

Dado que no estoy familiarizado con Linux, este error resulta ser como un "show-stopper" para mí. ¿Quizás Linux no tiene instrucciones de montar una unidad? ¿Pero cual? El mensaje no lo dice ...

¿Quizás Windows tiene que compartir una unidad o asignar una carpeta a una unidad que necesita ser compartida? El mensaje tampoco dice esto ...

Aquí hay una captura de pantalla del panel de Docker:

ingrese la descripción de la imagen aquí

Y aquí está el Dockerfile:

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

Cualquier ayuda sería muy apreciada. ¡Gracias por adelantado!

Alexander Christov
fuente

Respuestas:

15

El comando docker run incluye volúmenes de la unidad C, por ejemplo -v "C:\Users\admin\vsdbg\vs2017u5:/remote_debugger:rw". Para que esto funcione, debe incluir la unidad C en sus unidades compartidas (marque la casilla en configuración -> recursos -> uso compartido de archivos). También puede mover los archivos para compartirlos en la unidad D que ya está compartida en la VM incrustada, aunque probablemente no sea una opción en este caso. Para saber qué unidades compartir, verifique las unidades utilizadas en los montajes de volumen en el comando de ejecución.

En versiones anteriores de Docker para Windows, esto tendría éxito silenciosamente y montaría una carpeta vacía en el contenedor. Por lo tanto, el error que indica a los usuarios que verifiquen primero las unidades compartidas es una buena mejora.

BMitch
fuente
C: es mi unidad de arranque y el sistema operativo está instalado en ella. ¿Realmente crees que es una buena práctica compartir una información tan sensible?
Alexander Christov
@AlexanderChristov la unidad se comparte con la VM incorporada que le permite montar directorios desde allí en el contenedor. No puede decir que no desea compartir la unidad mientras también desea ejecutar comandos que requieren acceso a directorios en esa unidad. Este no es un problema de Docker, es un problema con el comando que le pide a Docker que ejecute.
BMitch
todavía "Ver 'docker run --help'". Es bastante inútil. De hecho, es algo dañino ya que conduce a una pérdida de tiempo pura, que, como puede ver, llevó a hacer la pregunta. gracias de todos modos.
Alexander Christov
@AlexanderChristov es un mensaje genérico para cualquier comando que falla, que le permite saber qué texto de ayuda de subcomando puede ser relevante. No estoy seguro de cómo ajustar eso para cubrir todas las posibles condiciones de error. El 500: {"Message":"Unhandled exception: Drive has not been shared"}mensaje que activó el error es la parte útil.
BMitch
Vea esto para saber dónde / cuándo generan ese --helpaviso: github.com/moby/moby/blob/…
BMitch
8

Hacer que la unidad C: disponible para los contenedores Docker desde el Docker Dashboard solucionó el problema , mira la imagen una vez más donde no se verificó.

Sin embargo, se deben compartir un par de comentarios en mi humilde opinión.

  • El mensaje de error no era claro qué unidad necesitaba ser compartida ( supongo que Linux admite más de una sola unidad )
  • Si sin hacer que la unidad C: esté disponible (o la unidad de arranque, en la que reside el sistema operativo) Docker no funcionaría , ¿por qué después de su instalación no comprobó la unidad en sí? Esto es solo un clic ( !! ) en el Docker Dashboard, por lo que debería ser (relativamente) fácil.

Puede existir una explicación muy simple de por qué se mostró este mensaje bastante inútil: los desarrolladores de Linux escriben mucho (¡CLI!) Y, como no están muy contentos con esto, no escriben lo suficiente como para dar un diagnóstico significativo a sus usuarios.

Bueno, creo que no estoy en lo cierto, pero aún debe haber una explicación de por qué aparece una omisión tan grande en un producto final.

Alexander Christov
fuente
Además, Docker es completamente funcional sin tener esa unidad marcada, siempre y cuando no intentes enlazar y montar un directorio desde tu sistema de archivos local. Lo único es que quieren seguir las políticas que establezca y no establecerlas para usted. (Imagínese ejecutar ciegamente un script que monta c: \ windows en el contenedor, y luego se sorprenderá cuando encuentre los hashes de su cuenta SAM agrietados ... lo que solo se permitió porque "útilmente" marcaron esa casilla para compartir la unidad C y no no te cuento sobre eso.)
sjcaged
1

extraiga el comando largo "docker run ... / dev / null" de la salida y ejecútelo solo en un símbolo del sistema habilitado para docker. El escritorio de Docker debería solicitar permiso para compartir / acceso a la red. Es posible que desee reiniciar la aplicación Docker Desktop antes de hacerlo.

Daryl
fuente