Докер: диск не был передан

15

При «dockerizing» приложении ASP.NET Core 3.1 MVC я получил следующий результат:

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.

Само собой разумеется, « docker run --help » не помогал вообще (отсутствующие ссылки / якоря в документации Docker и т. Д.).

Некоторая дополнительная информация:

  • Применение - это то, что строительные леса VS2019 без каких-либо модификаций .
  • Образ Docker - Linux (о котором я не могу сказать ).
  • Версия докера 19.03.5, сборка 633a0ea

Так как я не знаком с Linux, эта ошибка оказывается для меня «показательным стопором». Может быть, в Linux нет инструкции по подключению диска? Но какой? Сообщение не говорит это ...

Может быть, Windows должен предоставить общий доступ к диску или сопоставить папку с диском, который необходимо использовать совместно? В сообщении это тоже не сказано ...

Вот скриншот панели инструментов Docker:

введите описание изображения здесь

А вот и 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"]

Любая помощь приветствуется. Заранее спасибо!

Александр Христов
источник

Ответы:

15

Команда docker run включает тома с диска C, например -v "C:\Users\admin\vsdbg\vs2017u5:/remote_debugger:rw" . Чтобы они работали, вам нужно включить диск C в ваши общие диски (установите флажок в разделе настройки -> ресурсы -> общий доступ к файлам). Вы также можете переместить файлы для совместного использования на диск D, который уже используется для встроенной виртуальной машины, хотя в этом случае это, вероятно, не вариант. Чтобы узнать, какие диски использовать совместно, проверьте диски, используемые в томах, в команде run.

В предыдущих версиях Docker для Windows это происходило молча и монтировало пустую папку в контейнер. Таким образом, ошибка, призывающая пользователей сначала проверить общие диски, является хорошим улучшением.

BMitch
источник
C: мой загрузочный диск и на нем установлена ​​ОС. Вы действительно считаете хорошей практикой делиться такой важной информацией?
Александр Христов
@AlexanderChristov диск используется совместно со встроенной виртуальной машиной, что позволяет монтировать каталоги из этого в контейнер. Вы не можете сказать, что не хотите использовать общий доступ к диску, а также хотите запускать команды, требующие доступа к каталогам на этом диске. Это не проблема докера, это проблема с командой, которую вы просите запустить докер.
BMitch
все еще "Смотри" Docker run --help "." совершенно бесполезно. На самом деле это несколько вредно, поскольку приводит к пустой трате времени, что, как вы видите, привело к постановке вопроса. в любом случае, спасибо.
Александр Христов
@AlexanderChristov - это универсальное сообщение для любой команды, которая дает сбой, позволяющее узнать, какой текст справки подкоманды может иметь значение. Не уверен, как отрегулировать это, чтобы охватить все возможные условия ошибки. 500: {"Message":"Unhandled exception: Drive has not been shared"}Сообщение , которое вызвало ошибку является полезной частью.
BMitch
Посмотрите, где и когда они генерируют это --helpприглашение: github.com/moby/moby/blob/…
BMitch
8

Создание диска C: доступным для контейнеров Docker с панели инструментов Docker решило проблему , еще раз посмотрите на рисунок, где он не был проверен.

Тем не менее, пара комментариев должна быть предоставлена ​​IMHO.

  • В сообщении об ошибке не было ясно, какой диск необходимо было использовать совместно ( я думаю, Linux поддерживает более одного диска )
  • Если без предоставления диска C: (или загрузочного диска, на котором находится ОС) Docker не будет работать , почему после его установки он не проверил сам диск? Это всего лишь щелчок ( !! ) на панели инструментов Docker, поэтому он должен быть (относительно) легким.

Может существовать очень простое объяснение, почему было показано это совершенно бесполезное сообщение - разработчики Linux много пишут (CLI!), И, будучи не очень довольны этим, они не набирают достаточно, чтобы дать содержательную диагностику своим пользователям.

Что ж, я считаю, что я не прав, но все же должно быть объяснение, почему в конечном продукте появляется такое огромное упущение .

Александр Христов
источник
Кроме того, Docker полностью функционален без проверки этого диска, если вы не пытаетесь подключить каталог из локальной файловой системы. Единственное, что они хотят следовать установленным вами политикам, а не устанавливать их для вас. (Представьте, что вы слепо запускаете скрипт, который монтирует c: \ windows в контейнер, а затем удивляетесь, когда обнаружите, что хэши вашей учетной записи SAM взломаны ... это было разрешено только потому, что они «услужливо» поставили флажок в этом поле, чтобы разделить диск C, и не сделали этого ». не
могу
1

вытяните длинную команду «docker run ... / dev / null» из выходных данных и запустите ее самостоятельно в командной строке с поддержкой docker. Рабочий стол Docker должен запросить разрешение на совместное использование / доступ к сети. Возможно, вы захотите перезапустить приложение Docker Desktop, прежде чем сделать это.

Дэрил
источник