Docker: Drive belum dibagikan

15

Ketika "buruh pelabuhan" aplikasi ASP.NET Core 3.1 MVC saya mendapat hasil sebagai berikut:

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.

Tidak perlu dikatakan ' docker run --help ' tidak membantu sama sekali (tautan / jangkar yang hilang di dokumen Docker dll.).

Beberapa info tambahan:

  • Aplikasi adalah apa perancah VS2019 tanpa modifikasi .
  • Gambar Docker adalah Linux ( yang mana saya tidak tahu ).
  • Versi Docker adalah 19.03.5, build 633a0ea

Karena saya tidak terbiasa dengan Linux, kesalahan ini ternyata seperti "show-stopper" bagi saya. Mungkin Linux tidak diperintahkan untuk memasang drive? Tapi yang mana? Pesan tidak mengatakannya ...

Mungkin Windows harus membagikan drive, atau memetakan folder ke drive yang perlu dibagi? Pesan itu tidak mengatakan ini juga ...

Berikut screenshot dari dasbor Docker:

masukkan deskripsi gambar di sini

Dan inilah 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"]

Bantuan apa pun akan sangat dihargai. Terima kasih sebelumnya!

Alexander Christov
sumber

Jawaban:

15

Perintah menjalankan buruh pelabuhan mencakup volume dari drive C, misalnya -v "C:\Users\admin\vsdbg\vs2017u5:/remote_debugger:rw". Agar ini berfungsi, Anda harus memasukkan drive C di drive bersama Anda (centang kotak di bawah pengaturan -> sumber daya -> berbagi file). Anda juga dapat memindahkan file untuk dibagikan ke drive D yang sudah dibagikan ke VM tertanam, meskipun itu kemungkinan bukan opsi dalam kasus ini. Untuk mengetahui drive mana yang akan dibagikan, periksa drive yang digunakan dalam pemasangan volume di perintah run.

Dalam versi docker untuk Windows sebelumnya, ini akan berhasil dan secara diam-diam meletakkan folder kosong ke dalam wadah. Jadi kesalahan memberitahu pengguna untuk memeriksa drive bersama terlebih dahulu adalah peningkatan yang bagus.

BMitch
sumber
C: adalah drive boot saya dan OS diinstal di sana. Apakah Anda benar-benar berpikir itu adalah praktik yang baik untuk membagikan informasi sensitif seperti itu?
Alexander Christov
@AlexanderChristov drive dibagikan dengan VM tertanam yang memungkinkan Anda untuk memasang direktori dari itu ke dalam wadah. Anda tidak bisa mengatakan bahwa Anda tidak ingin berbagi drive sementara juga ingin menjalankan perintah yang memerlukan akses ke direktori pada drive itu. Ini bukan masalah buruh pelabuhan, ini adalah masalah dengan perintah yang Anda minta buruh pelabuhan untuk jalankan.
BMitch
masih "Lihat 'buruh pelabuhan menjalankan --membantu'." sangat tidak berguna. Bahkan itu agak berbahaya karena mengarah pada pemborosan waktu murni, yang, seperti yang Anda lihat mengarah pada pertanyaan. ngomong-ngomong, terima kasih.
Alexander Christov
@AlexanderChristov itu adalah pesan umum untuk setiap perintah yang gagal, memberi tahu Anda teks bantuan subkomand mana yang relevan. Tidak yakin bagaimana menyesuaikannya untuk mencakup setiap kondisi kesalahan yang mungkin terjadi. The 500: {"Message":"Unhandled exception: Drive has not been shared"}pesan yang memicu kesalahan adalah bagian berguna.
BMitch
Lihat ini di mana / kapan mereka menghasilkan --helpprompt itu: github.com/moby/moby/blob/…
BMitch
8

Membuat drive C: tersedia untuk wadah Docker dari Docker Dashboard menyelesaikan masalah , lihat gambar sekali lagi di tempat itu tidak diperiksa.

Namun, beberapa komentar harus dibagikan IMHO.

  • Pesan kesalahan tidak jelas drive mana yang perlu dibagikan (Linux mendukung lebih dari satu drive , saya kira)
  • Jika tanpa membuat drive C: tersedia (atau drive yang dapat di-boot, yang merupakan tempat OS berada) Docker tidak akan berfungsi , mengapa setelah pemasangannya ia tidak memeriksa drive itu sendiri? Ini hanya klik ( !! ) di Docker Dashboard, jadi seharusnya (relatif) mudah.

Penjelasan yang sangat sederhana mengapa pesan yang tidak berguna ini ditampilkan mungkin ada - pengembang Linux banyak mengetik (CLI!) Dan karena tidak terlalu senang dengan ini, mereka tidak cukup mengetik untuk memberikan diagnosa yang berarti bagi pengguna mereka.

Yah, saya yakin saya tidak benar, tetapi masih harus ada penjelasan mengapa kelalaian besar seperti itu muncul dalam produk akhir.

Alexander Christov
sumber
Selain itu, Docker berfungsi sepenuhnya tanpa memeriksa drive tersebut, asalkan Anda tidak mencoba mengikat direktori dari sistem file lokal Anda. Satu-satunya hal adalah mereka ingin mengikuti kebijakan yang Anda tetapkan, dan tidak menetapkannya untuk Anda. (Bayangkan membabi buta menjalankan skrip yang me-mount c: \ windows ke dalam wadah, dan kemudian terkejut ketika Anda menemukan hash akun SAM Anda retak ... yang hanya diizinkan karena mereka "membantu" memeriksa kotak itu untuk membagikan drive C dan tidak t memberitahu Anda tentang hal itu.)
sjcaged
1

tarik keluar "docker run ... / dev / null" yang panjang dari output dan jalankan dengan sendirinya di docker command prompt yang diaktifkan. Desktop Docker kemudian harus meminta untuk mengizinkan berbagi / akses jaringan. Anda mungkin ingin memulai kembali aplikasi Docker Desktop sebelum melakukannya.

Daryl
sumber