【问题标题】:Docker: Drive has not been sharedDocker:驱动器尚未共享
【发布时间】:2020-05-13 11:26:09
【问题描述】:

当“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,build 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"]

任何帮助将不胜感激。提前致谢!

【问题讨论】:

    标签: docker asp.net-core


    【解决方案1】:

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

    在以前版本的 docker for Windows 中,这会静默成功并将一个空文件夹挂载到容器中。所以告诉用户首先检查共享驱动器的错误是一个很好的改进。

    【讨论】:

    • C: 是我的启动驱动器,操作系统安装在上面。你真的认为分享如此敏感的信息是一种好习惯吗?
    • @AlexanderChristov 该驱动器与嵌入式 VM 共享,允许您将目录从该 VM 挂载到容器中。您不能说不想共享驱动器,同时又想运行需要访问该驱动器上目录的命令。这不是 docker 问题,这是您要求 docker 运行的命令的问题。
    • 仍然“请参阅 'docker run --help'。”是很没用的。事实上,这有点有害,因为这会导致纯粹的时间浪费,正如你所看到的,这会导致提出这个问题。无论如何,谢谢。
    • @AlexanderChristov 这是任何失败命令的通用消息,让您知道哪个子命令帮助文本可能相关。不知道如何调整它以涵盖所有可能的错误情况。触发错误的500: {"Message":"Unhandled exception: Drive has not been shared"} 消息是有用的部分。
    • 查看此内容以了解他们在何处/何时生成 --help 提示:github.com/moby/moby/blob/…
    【解决方案2】:

    使驱动器 C:可用于 Docker 容器从 Docker 仪表板解决了问题,再次查看未选中的图片。

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

    • 错误信息不清楚需要共享哪个驱动器(Linux 支持多个驱动器,我猜)
    • 如果没有使驱动器 C: 可用(或可引导驱动器,操作系统所在的驱动器)Docker 将无法正常工作,为什么在安装后它没有检查驱动器本身?这只是在 Docker Dashboard 中单击 (!!),所以应该(相对)容易。

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

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

    【讨论】:

    • 此外,只要您不尝试从本地文件系统绑定挂载目录,Docker 就可以在不检查驱动器的情况下完全正常运行。唯一的问题是他们想要遵循您设置的策略,而不是为您设置它们。 (想象一下盲目地运行一个将 c:\windows 挂载到容器中的脚本,然后当你发现你的 SAM 帐户哈希被破解时感到惊讶......这只是被允许的,因为他们“帮助”检查了该框以共享驱动器 C 并且没有不告诉你。)
    【解决方案3】:

    在 docker 的“文件共享”UI 下添加项目:

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-14
        • 2011-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多