นักเทียบท่า: ไม่ได้แชร์ไดรฟ์


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.

ไม่จำเป็นต้องพูดว่า ' นักเทียบท่าทำงาน - ช่วยเหลือ ' ไม่ได้ช่วยอะไรเลย (ลิงค์ / จุดยึดที่ขาดหายไปในเอกสารนักเทียบท่า ฯลฯ )

ข้อมูลเพิ่มเติมบางส่วน:

  • การประยุกต์ใช้เป็นสิ่งที่ VS2019 โครงโดยไม่มีการแก้ไขใด
  • ภาพนักเทียบท่าคือ Linux ( อันที่ฉันไม่สามารถบอกได้ )
  • เวอร์ชันของ Docker คือ19.03.5, สร้าง 633a0ea

เนื่องจากฉันไม่คุ้นเคยกับ Linux ข้อผิดพลาดนี้จึงกลายเป็นเหมือน "show-stopper" สำหรับฉัน บางที 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

คำสั่งนักเทียบท่าวิ่งรวมถึงไดรฟ์จากไดรฟ์ C -v "C:\Users\admin\vsdbg\vs2017u5:/remote_debugger:rw"เช่น เพื่อให้ใช้งานได้คุณจะต้องรวมไดรฟ์ C ในไดรฟ์ที่แชร์ของคุณ (ทำเครื่องหมายในช่องภายใต้การตั้งค่า -> ทรัพยากร -> การแชร์ไฟล์) คุณยังสามารถย้ายไฟล์ที่จะแชร์ไปยังไดรฟ์ D ซึ่งแชร์ไปยัง VM แบบฝังแล้วแม้ว่าจะไม่มีตัวเลือกในกรณีนี้ หากต้องการทราบว่าจะแบ่งปันไดรฟ์ใดให้ตรวจสอบไดรฟ์ที่ใช้ในโวลุ่มที่เมาท์ในคำสั่งเรียกใช้

ใน Docker เวอร์ชันก่อนหน้าสำหรับ Windows นี่จะประสบความสำเร็จอย่างเงียบ ๆ และเมานต์โฟลเดอร์เปล่าลงในคอนเทนเนอร์ ดังนั้นข้อผิดพลาดที่บอกให้ผู้ใช้ตรวจสอบไดรฟ์ที่ใช้ร่วมกันก่อนคือการปรับปรุงที่ดี


C: เป็นไดรฟ์สำหรับบูตและติดตั้งระบบปฏิบัติการไว้ คุณคิดว่าเป็นการดีที่จะแบ่งปันข้อมูลที่ละเอียดอ่อนเช่นนี้หรือไม่?
Alexander Christov

@AlexanderChristov ไดรฟ์ได้รับการแบ่งปันกับ VM ที่ฝังตัวซึ่งช่วยให้คุณสามารถติดไดเรกทอรีจากนั้นลงในภาชนะ คุณไม่สามารถพูดได้ว่าคุณไม่ต้องการแชร์ไดรฟ์ในขณะที่ต้องการเรียกใช้คำสั่งที่ต้องการการเข้าถึงไดเรกทอรีในไดรฟ์นั้น นี่ไม่ใช่ปัญหานักเทียบท่านี่เป็นปัญหากับคำสั่งที่คุณขอให้นักเทียบท่าทำงาน
BMitch

ยัง "ดู 'เรียกใช้นักเทียบท่า - ช่วย' ค่อนข้างไร้ประโยชน์ ในความเป็นจริงมันค่อนข้างอันตรายเนื่องจากนำไปสู่การเสียเวลาบริสุทธิ์ซึ่งในขณะที่คุณสามารถเห็นนำไปสู่การถามคำถาม อย่างไรก็ตามขอบคุณ
Alexander Christov

@AlexanderChristov เป็นข้อความทั่วไปสำหรับคำสั่งใด ๆ ที่ล้มเหลวแจ้งให้คุณทราบว่าข้อความช่วยเหลือคำสั่งย่อยใดอาจเกี่ยวข้อง ไม่แน่ใจว่าจะปรับวิธีการอย่างไรให้ครอบคลุมทุกสภาวะข้อผิดพลาดที่เป็นไปได้ 500: {"Message":"Unhandled exception: Drive has not been shared"}ข้อความที่เรียกข้อผิดพลาดเป็นส่วนที่มีประโยชน์
BMitch

ดูสิ่งนี้สำหรับที่ / เมื่อพวกเขาสร้าง--helpพรอมต์นั้น: github.com/moby/moby/blob/
......

8

การทำให้ไดรฟ์ C: พร้อมใช้งานสำหรับคอนเทนเนอร์ Dockerจากแผงควบคุม Docker แก้ไขปัญหาให้ดูที่รูปภาพอีกครั้งโดยไม่ได้ตรวจสอบ

อย่างไรก็ตามความคิดเห็นบางรายการจะต้องมีการแบ่งปัน IMHO

  • ข้อความแสดงข้อผิดพลาดไม่ชัดเจนว่าต้องใช้ไดรฟ์ใด (Linux รองรับมากกว่าไดรฟ์เดียวฉันเดา)
  • หากไม่มีการทำให้ไดรฟ์ C: ว่าง (หรือไดรฟ์ที่สามารถบู๊ตได้ระบบที่มีระบบปฏิบัติการอยู่) Docker จะไม่ทำงานทำไมหลังจากการติดตั้งแล้วไม่ได้ตรวจสอบไดรฟ์เอง นี่เป็นเพียงการคลิก ( !! ) ใน Dasher Dashboard ดังนั้นควรง่าย (ค่อนข้าง)

คำอธิบายง่ายๆว่าทำไมข้อความที่ไร้ประโยชน์นี้จึงปรากฏขึ้น - ผู้พัฒนา Linux พิมพ์จำนวนมาก (CLI!) และไม่พอใจกับสิ่งนี้มากนักพวกเขาไม่พิมพ์พอที่จะให้การวินิจฉัยที่มีความหมายแก่ผู้ใช้

ฉันเชื่อว่าฉันไม่ถูกต้อง แต่ก็ยังต้องมีคำอธิบายว่าทำไมการละเลยครั้งใหญ่เช่นนี้ปรากฏในผลิตภัณฑ์สุดท้าย


นอกจากนี้ Docker ยังทำงานได้อย่างสมบูรณ์โดยไม่ต้องตรวจสอบไดรฟ์นั้นตราบใดที่คุณไม่ได้พยายามผูกติดไดเรกทอรีจากระบบไฟล์ในเครื่องของคุณ สิ่งเดียวคือพวกเขาต้องการทำตามนโยบายที่คุณตั้งไว้และไม่ได้กำหนดไว้สำหรับคุณ (ลองนึกภาพการเรียกใช้สคริปต์ที่เมานต์ c: \ windows ในคอนเทนเนอร์แล้วแปลกใจเมื่อคุณพบว่าบัญชี SAM ของคุณแฮ็คแตก ... ซึ่งได้รับอนุญาตเพียงเพราะพวกเขา "ช่วย" ตรวจสอบกล่องนั้นเพื่อแบ่งปันไดรฟ์ C และไม่ได้ ' ไม่บอกคุณเกี่ยวกับเรื่องนี้)
sjcaged

1

ดึงคำสั่ง "นักเทียบท่าเรียกใช้ ... / dev / null" ที่ยาวออกจากเอาต์พุตและรันด้วยตัวเองที่พร้อมท์คำสั่งที่เปิดใช้งานนักเทียบท่า เดสก์ท็อป Docker ควรแจ้งให้อนุญาตการแชร์ / การเข้าถึงเครือข่าย คุณอาจต้องการรีสตาร์ทแอพ Docker Desktop ก่อนที่จะทำเช่นนั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.