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입니다 ( 알 수없는 것 ).
  • 도커 버전은 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가 설치되어 있습니다. 그러한 민감한 정보를 공유하는 것이 좋은 습관이라고 생각하십니까?
Alexander Christov

@AlexanderChristov 드라이브는 임베디드 VM과 공유되므로 디렉토리에서 컨테이너로 디렉토리를 마운트 할 수 있습니다. 드라이브를 공유하고 싶지는 않지만 해당 드라이브의 디렉토리에 액세스해야하는 명령을 실행하려고한다고 말할 수 없습니다. 이것은 도커 문제가 아니며,도 커가 실행하도록 요청하는 명령의 문제입니다.
BMitch

여전히 " 'docker run --help'를 참조하십시오." 꽤 쓸모가 없습니다. 실제로 그것은 순수한 시간 낭비로 이어지기 때문에 다소 해 롭습니다. 어쨌든 고마워.
Alexander Christov

@AlexanderChristov이 명령은 실패한 명령에 대한 일반적인 메시지이므로 어떤 도움말 명령 텍스트가 관련이 있는지 알려줍니다. 가능한 모든 오류 조건을 처리하도록 조정하는 방법을 모릅니다. 500: {"Message":"Unhandled exception: Drive has not been shared"}오류를 트리거 메시지가 유용한 부분이다.
BMitch

github.com/moby/moby/blob/…--help 프롬프트 를 생성하는 위치 / 위치에 대해서는 다음을 참조하십시오 .
BMitch

8

Docker Dashboard에서 C 드라이브를 Docker 컨테이너에 사용할 수있게 하면 문제가 해결 되었습니다. 확인되지 않은 그림을 다시 한 번보십시오.

그러나 몇 가지 의견은 IMHO와 공유해야합니다.

  • 오류 메시지가 어느 드라이브를 공유해야하는지 명확하지 않았습니다 (Linux는 단일 드라이브 이상을 지원합니다 ).
  • 드라이브 C :를 사용 가능하게하지 않으면 (또는 OS가 상주하는 부팅 가능한 드라이브) Docker 가 작동 하지 않는 경우 설치 후에 드라이브 자체를 확인하지 않은 이유는 무엇입니까? 이다 번의 클릭 ( ! 쉽게 (상대적으로)해야한다, 그래서 도커 대시 보드).

이 쓸모없는 메시지가 표시되는 이유에 대한 아주 간단한 설명이있을 수 있습니다. Linux 개발자는 많은 것을 입력하고 (CLI!) 매우 만족스럽지 않아서 사용자에게 의미있는 진단을 제공하기에 충분하지 않습니다.

글쎄, 나는 내가 옳지 않다고 생각하지만, 왜 그런 거대한 누락 이 최종 제품에 나타나는지 설명이 있어야합니다 .


또한 Docker는 로컬 파일 시스템에서 디렉토리를 바인딩 마운트하지 않으려는 경우 드라이브를 확인하지 않고도 완벽하게 작동합니다. 유일한 것은 그들이 설정 한 정책을 따르고 싶지는 않다는 것입니다. (컨테이너에 c : \ windows를 마운트하는 스크립트를 맹목적으로 실행 한 다음 SAM 계정 해시가 깨지는 것을보고 놀라게된다고 상상해보십시오. 드라이브 C를 공유하기 위해 해당 상자를 "도움말로"확인했기 때문에 허용되었습니다. t 그것에 대해 말해주십시오.)
sjcaged

1

긴 "docker run ... / dev / null"명령을 출력에서 ​​꺼내고 docker enabled 명령 프롬프트에서 자체적으로 실행하십시오. Docker 데스크탑은 공유 / 네트워크 액세스를 허용하라는 메시지를 표시해야합니다. 시작하기 전에 Docker Desktop 앱을 다시 시작하는 것이 좋습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.