Docker:ドライブは共有されていません


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が変更を加えずに足場組むものです。
  • 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"]

どんな助けでも大歓迎です。前もって感謝します!

回答:


15

docker runコマンドには、Cドライブのボリュームが含まれ-v "C:\Users\admin\vsdbg\vs2017u5:/remote_debugger:rw"ます。これらを機能させるには、Cドライブを共有ドライブに含める必要があります(設定->リソース->ファイル共有の下のボックスをチェックします)。共有VMに既に共有されているDドライブに共有するファイルを移動することもできますが、この場合はオプションではありません。共有するドライブを確認するには、ボリュームマウントで使用されているドライブをrunコマンドで確認します。

以前のバージョンのWindows用dockerでは、これは警告なしに成功し、空のフォルダーをコンテナーにマウントしました。したがって、最初に共有ドライブを確認するようユーザーに指示するエラーは、素晴らしい改善です。


C:は私のブートドライブで、OSがインストールされています。このような機密情報を共有することは良い習慣だと本当に思いますか?
アレクサンドルクリストフ

@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

Cドライブ: DockerダッシュボードからDockerコンテナーで使用できるようにすることで問題が解決しました。チェックされていない場所の画像をもう一度見てください。

ただし、いくつかのコメントはIMHOで共有する必要があります。

  • エラーメッセージでは、共有する必要のあるドライブが明確ではありませんでした(Linuxは複数のドライブをサポートしていると思います)。
  • ドライブC:(またはOSが常駐する起動可能ドライブ)を使用可能にしない場合、Docker は機能しませんが、インストール後にドライブ自体をチェックしなかったのはなぜですか?これはDockerダッシュボードでクリック!!)するだけなので、(比較的)簡単です。

この非常に役に立たないメッセージが表示された非常に単純な説明が存在する可能性があります-Linux開発者は多くのタイプ(CLI!)を入力し、これにあまり満足していないため、ユーザーに意味のある診断を与えるのに十分なタイプを入力していません。

ええと、私は正しくないと思いますが、それでも、最終製品にそのような大きな欠落が見られる理由については説明が必要です。


また、ローカルファイルシステムからディレクトリをバインドマウントしようとしない限り、Dockerはドライブをチェックしなくても完全に機能します。唯一のことは、彼らはあなたが設定したポリシーに従うことを望んでおり、あなたのためにそれらを設定したくないということです。(c:\ windowsをコンテナーにマウントするスクリプトを盲目的に実行し、SAMアカウントのハッシュがクラックされていることに驚いたと想像してみてください...ドライブCを共有するために「有効に」チェックボックスをオンにしたので、これは許可されましたtについて教えてください。)
sjcaged

1

長い「docker run ... / dev / null」コマンドを出力から引き出し、ドッカーが有効なコマンドプロンプトで単独で実行します。Dockerデスクトップは、共有/ネットワークアクセスを許可するようプロンプトを表示します。再起動する前に、Dockerデスクトップアプリを再起動することをお勧めします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.