Docker: a unidade não foi compartilhada

15

Ao "encaixar" um aplicativo MVC do ASP.NET Core 3.1, obtive o seguinte 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.

Escusado será dizer que ' docker run --help ' não ajudou em nada (falta de links / âncoras nos documentos do Docker etc.).

Algumas informações adicionais:

  • Aplicação é o que andaimes VS2019 sem nenhuma modificação .
  • A imagem do Docker é Linux ( que não sei dizer ).
  • A versão do Docker é 19.03.5, compilação 633a0ea

Como não estou familiarizado com o Linux, esse erro acaba sendo como um "impedimento de exibição" para mim. Talvez o Linux não seja instruído a montar uma unidade? Mas qual deles? A mensagem não diz isso ...

Talvez o Windows precise compartilhar uma unidade ou mapear uma pasta para uma unidade que precise ser compartilhada? A mensagem também não diz isso ...

Aqui está uma captura de tela do painel do Docker:

insira a descrição da imagem aqui

E aqui está o 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"]

Qualquer ajuda seria muito apreciada. Desde já, obrigado!

Alexander Christov
fonte

Respostas:

15

O comando docker run inclui volumes da unidade C, por exemplo -v "C:\Users\admin\vsdbg\vs2017u5:/remote_debugger:rw". Para que funcionem, é necessário incluir a unidade C em suas unidades compartilhadas (marque a caixa em configurações -> recursos -> compartilhamento de arquivos). Você também pode mover os arquivos a serem compartilhados na unidade D, que já está compartilhada na VM incorporada, embora isso provavelmente não seja uma opção nesse caso. Para saber quais unidades compartilhar, verifique as unidades usadas nas montagens de volume no comando run.

Nas versões anteriores do docker para Windows, isso seria bem-sucedido silenciosamente e montaria uma pasta vazia no contêiner. Portanto, o erro ao pedir aos usuários para verificar primeiro as unidades compartilhadas é uma boa melhoria.

BMitch
fonte
C: é a minha unidade de inicialização e o sistema operacional está instalado nela. Você realmente acha que é uma boa prática compartilhar informações tão sensíveis?
Alexander Christov
@AlexanderChristov, a unidade é compartilhada com a VM incorporada, que permite montar diretórios a partir dela no contêiner. Você não pode dizer que não deseja compartilhar a unidade e também deseja executar comandos que requerem acesso aos diretórios dessa unidade. Este não é um problema do docker, é um problema com o comando que você solicita ao docker para executar.
BMitch 5/02
ainda "Consulte 'docker run --help'." é bastante inútil. Na verdade, é um pouco prejudicial, pois leva a um puro desperdício de tempo, o que, como você pode ver, levou a fazer a pergunta. de qualquer forma, obrigado.
Alexander Christov
@AlexanderChristov é uma mensagem genérica para qualquer comando que falha, informando qual texto de ajuda do subcomando pode ser relevante. Não sabe ao certo como ajustar isso para cobrir todas as condições de erro possíveis. A 500: {"Message":"Unhandled exception: Drive has not been shared"}mensagem que acionou o erro é a parte útil.
BMitch 5/02
Veja isso para onde / quando eles geram esse --helpprompt: github.com/moby/moby/blob/…
BMitch
8

Disponibilizar a unidade C: para contêineres do Docker no Painel do Docker resolveu o problema , observe a figura mais uma vez onde não foi verificada.

Alguns comentários devem ser compartilhados IMHO, no entanto.

  • A mensagem de erro não estava clara sobre qual unidade precisava ser compartilhada (o Linux suporta mais de uma unidade , eu acho)
  • Se, sem disponibilizar a unidade C: (ou a unidade inicializável, aquela em que reside o SO), o Docker não funcionaria , por que, após a instalação, não verificou a própria unidade? Este é apenas um clique ( !! ) no Painel do Docker, portanto deve ser (relativamente) fácil.

Pode existir uma explicação muito simples para a exibição dessa mensagem inútil - os desenvolvedores do Linux digitam muito (CLI!) E, não estando muito satisfeitos com isso, não digitam o suficiente para fornecer um diagnóstico significativo aos usuários.

Bem, acredito que não estou certo, mas ainda deve haver uma explicação para que uma omissão tão grande apareça no produto final.

Alexander Christov
fonte
Além disso, o Docker é completamente funcional sem que a unidade seja marcada, desde que você não esteja tentando montar um diretório a partir de um sistema de arquivos local. A única coisa é que eles desejam seguir as políticas que você definiu e não para você. (Imagine executar cegamente um script que monta c: \ windows no contêiner e, em seguida, ser surpreendido quando você encontrar os hashes da sua conta do SAM quebrados ... o que só foi permitido porque eles "ajudaram" a marcar a caixa para compartilhar a unidade C e não Eu te digo.)
sjcaged 26/04
1

retire o comando longo "docker run ... / dev / null" da saída e execute-o sozinho em um prompt de comando ativado pelo docker. A área de trabalho do Docker deverá solicitar o acesso ao compartilhamento / rede. Convém reiniciar o aplicativo Docker Desktop antes de fazê-lo.

Daryl
fonte