Докер: Диск не ділився


15

Під час "докерізації" програми 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 будівельних лісів без будь-яких модифікацій .
  • Образ Докера - це Linux ( якого я не можу сказати ).
  • Версія Docker - 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

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

У попередніх версіях докера для Windows це мовчки вдалося б і встановити порожню папку в контейнер. Тож помилка, що сповіщає користувачів спочатку перевірити спільні диски - це приємне поліпшення.


C: мій завантажувальний диск і на ньому встановлена ​​ОС. Чи дійсно ви вважаєте, що є хорошою практикою ділитися такою конфіденційною інформацією?
Олександр Христов

@AlexanderChristov накопичувач поділяється з вбудованим VM, який дозволяє монтувати каталоги з цього в контейнер. Ви не можете сказати, що ви не хочете ділитися диском, а також хочете запускати команди, для яких потрібен доступ до каталогів на цьому диску. Це не проблема докера, це проблема з командою, яку ви просите виконати докер.
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 і didn " t скажу вам про це.)
відказав

1

витягніть довгу команду "docker run ... / dev / null" з виводу та запустіть її самостійно в командному рядку, включеному докер. Потім робочий стіл Docker повинен підказувати, щоб дозволити спільний доступ / доступ до мережі. Ви можете перезапустити додаток Docker Desktop перед цим.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.