Docker:驱动器尚未共享


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(我不能告诉我)。
  • 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"]

任何帮助将非常感激。提前致谢!

Answers:


15

docker run命令包括C驱动器中的卷,例如-v "C:\Users\admin\vsdbg\vs2017u5:/remote_debugger:rw"。为了使它们起作用,您需要在共享驱动器中包括C驱动器(选中设置->资源->文件共享下的框)。您也可以将要共享的文件移动到已经共享给嵌入式VM的D驱动器,尽管在这种情况下这可能不是一种选择。要知道要共享哪些驱动器,请在run命令中检查卷装载中使用的驱动器。

在Windows的早期docker版本中,此操作将默默地成功并将空文件夹安装到容器中。因此,告诉用户首先检查共享驱动器的错误是一个不错的改进。


C:是我的启动驱动器,并且已安装操作系统。您真的认为共享这样的敏感信息是一种好习惯吗?
亚历山大·克里斯托夫

@AlexanderChristov驱动器与嵌入式VM共享,从而使您可以将目录从该目录挂载到容器中。您不能说您不想共享驱动器,同时也想运行需要访问该驱动器上的目录的命令。这不是docker问题,这是您要求docker运行的命令的问题。
BMitch

仍然是“请参阅'docker run --help'。” 完全没用 实际上,这有点有害,因为它会浪费时间,正如您所看到的,这会导致提出问题。还是谢谢你。
亚历山大·克里斯托夫

@AlexanderChristov是任何失败命令的通用消息,让您知道哪个子命令帮助文本可能是相关的。不知道如何进行调整以覆盖所有可能的错误情况。500: {"Message":"Unhandled exception: Drive has not been shared"}触发错误的消息是有用的部分。
BMitch

看到这个对于其中/当他们产生--help提示:github.com/moby/moby/blob/...
BMitch

8

通过Docker Dashboard 使驱动器C:可用于Docker容器解决了该问题,再次查看未检查图片的位置。

但是,必须共享几个注释,恕我直言。

  • 错误消息不清楚,需要共享哪个驱动(我猜Linux支持的驱动器不止一个
  • 如果没有使驱动器C:可用(或可引导驱动器,即操作系统所在的驱动器),则Docker 将无法运行,为什么在安装后它没有检查驱动器本身?这只是 Docker仪表板中的一个单击!!),因此(相对)容易。

可能存在一个非常简单的解释,为什么显示此非常无用的消息-Linux开发人员键入很多(CLI!),并且对此不满意,因此他们键入的内容不足以向用户提供有意义的诊断信息。

好吧,我确实认为我是错的,但是仍然必须有一个解释,为什么最终产品中会出现如此巨大的遗漏


同样,只要您不尝试从本地文件系统绑定挂载目录,Docker即可完全正常运行而无需检查该驱动器。唯一的事情是他们想遵循您设置的策略,而不是为您设置它们。(想象一下,盲目地运行一个将c:\ windows挂载到容器中的脚本,然后惊讶地发现SAM帐户散列被破解了……这是被允许的,因为它们“有效地”选中了共享驱动器C的复选框,而没有告诉你。)
sjcaged

1

从输出中拉出长的“ docker run ... / dev / null”命令,并在启用了docker的命令提示符下单独运行它。然后,Docker桌面应提示允许共享/网络访问。您可能需要先重新启动Docker Desktop应用程序。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.