Pasang direktori saat ini sebagai volume di Docker pada Windows 10

132

Deskripsi

Saya menggunakan Docker versi 1.12.5 di Windows 10 melalui Hyper-V dan ingin menggunakan container executable sebagai perintah di jalur saat ini. Saya membuat image Docker yang berfungsi dengan baik, tetapi saya memiliki masalah untuk memasang jalur saat ini. Idenya adalah untuk membuat alias dan melakukan docker run --rm [...]perintah sehingga dapat digunakan di seluruh sistem di direktori saat ini.

Mempersiapkan

Saya memiliki drive E dengan folder "test" dan di sana folder bernama "folder on windows host" untuk menunjukkan bahwa perintah tersebut berfungsi. Dockerfile membuat direktori /data, mendefinisikannya sebagai VOLUME dan WORKDIR.

Memiliki E:\testdirektori saat ini di PowerShell dan menjalankan perintah Docker dengan jalur absolut, saya dapat melihat konten dari E:\test:

PS E:\test> docker run --rm -it -v E:\test:/data mirkohaaser/docker-clitools ls -la
total 0
drwxr-xr-x 2 root root 0 Jan  4 11:45 .
drwxr-xr-x 2 root root 0 Jan  5 12:17 folder on windows host

Masalah

Saya ingin menggunakan direktori saat ini dan bukan notasi absolut. Saya tidak dapat menggunakan pwd dalam volume karena pesan kesalahan yang berbeda:

Mencoba dengan ($ pwd)

PS E:\test> docker run --rm -it -v ($pwd):/data mirkohaaser/docker-clitools ls -la
C:\Program Files\Docker\Docker\Resources\bin\docker.exe: Error parsing reference: ":/data" is not a valid repository/tag.
See 'C:\Program Files\Docker\Docker\Resources\bin\docker.exe run --help'.

Mencoba dengan / ($ pwd)

PS E:\test> docker run --rm -it -v /($pwd):/data mirkohaaser/docker-clitools ls -la
C:\Program Files\Docker\Docker\Resources\bin\docker.exe: Error parsing reference: "E:\\test" is not a valid repository/tag.
See 'C:\Program Files\Docker\Docker\Resources\bin\docker.exe run --help'.

Mencoba dengan \ ´pwd \ ´

PS E:\test> docker run --rm -it -v ´$pwd´:/data mirkohaaser/docker-clitools ls -la
C:\Program Files\Docker\Docker\Resources\bin\docker.exe: Error response from daemon: Invalid bind mount spec "´E:\\test´:/data": invalid mode: /data.
See 'C:\Program Files\Docker\Docker\Resources\bin\docker.exe run --help'.

Mencoba dengan `pwd`

PS E:\test> docker run --rm -it -v `$pwd`:/data mirkohaaser/docker-clitools ls -la
C:\Program Files\Docker\Docker\Resources\bin\docker.exe: Error response from daemon: create $pwd: "$pwd" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed.
See 'C:\Program Files\Docker\Docker\Resources\bin\docker.exe run --help'.

Apa sintaks yang benar untuk memasang direktori saat ini sebagai volume di Docker pada Windows 10?

McGo
sumber

Jawaban:

308

Di Windows Command Line ( cmd), Anda dapat memasang direktori saat ini seperti:

docker run --rm -it -v %cd%:/usr/src/project gcc:4.9

Di PowerShell, Anda menggunakan ${PWD}, yang memberi Anda direktori saat ini:

docker run --rm -it -v ${PWD}:/usr/src/project gcc:4.9

Di Linux:

docker run --rm -it -v $(pwd):/usr/src/project gcc:4.9

Lintas Platform

Opsi berikut akan berfungsi di PowerShell dan di Linux (setidaknya Ubuntu):

docker run --rm -it -v ${PWD}:/usr/src/project gcc:4.9
docker run --rm -it -v $(pwd):/usr/src/project gcc:4.9
ETL
sumber
Contoh Anda untuk CMD sudah benar dan berfungsi dengan baik! Varian Power Shell tidak berfungsi, meskipun $ pwd.path itu sendiri sudah benar, itu tidak diselesaikan ke nilai yang benar saat digunakan dalam skrip: gist.github.com/McGo/8924cc5b0609f13c39092554a0bef183
McGo
3
${PWD}bekerja pada sistem Unix juga (Linux, macOS). Catatan : pwd= sekarang direktori kerja
thiagowfx
2
@cjsimon Sepertinya sebenarnya ada ... sepertinya dukungan PowerShell $(pwd)yang juga akan bekerja di Linux (saya pikir - belum teruji)
ETL
13
Dengan Git Bash, ini bisa berupa winpty docker run -it -v "/$(pwd -W):/usr/src/project" gcc:4.9atau winpty docker run -it -v "/$(cmd //c cd):/usr/src/project" gcc:4.9.
kittaakos
1
tidak bekerja untuk saya di windows 10, pemasangan berhasil tetapi direktori target kosong
J. Doem
23

Ini berfungsi untuk saya di PowerShell:

docker run --rm -v ${PWD}:/data alpine ls /data
friisme
sumber
5
Apakah ini masih berlaku? Saya mendapatkan yang berikut saat mencoba:PS C:\Users\X\Projects\docker_django> docker run --rm -v ${PWD}:/data alpine ls /data C:\Program Files\Docker Toolbox\docker.exe: Error response from daemon: invalid mode: /data. See 'C:\Program Files\Docker Toolbox\docker.exe run --help'.
mistalaba
@mistalaba Jika Anda menggunakan Windows 10, coba gunakan Docker for Windowssebagai ganti Toolbox.
Finlay Roelofs
2
@ finlay-roelofs Terima kasih, tetapi Docker untuk Win hanya bekerja dengan Win Pro.
mistalaba
9

Untuk Git Bash untuk Windows (di ConEmu), berikut ini berfungsi untuk saya (untuk wadah Docker Windows):

docker run --rm -it -v `pwd -W`:c:/api microsoft/dotnet:2-runtime

Perhatikan backticks / backquote di sekitar pwd -W!

Dengan semua variasi PWD lain yang saya coba, saya telah menerima: "Error response from daemon: invalid volume specification: ..."

Pembaruan: Di atas adalah untuk wadah Docker Windows, untuk wadah Linux gunakan:

docker run --rm -it -v `pwd -W`:/api -p 8080:80 microsoft/aspnetcore:2
ToastedSoul
sumber
Tidak berfungsi untuk saya dari cmder docker run -v pwd -W: / usr / share / data atomgraph / fuseki --file = / usr / share / data / Mokyklu_sarasas.ttl / mokyklos File tidak ditemukan: C: / tools / cmder / vendor /git-for-windows/usr/share/data/Mokyklu_sarasas.ttl
Martynas Jusevičius
Saya melakukannya, termasuk backticks, dan bekerja dengan baik menggunakan gitbash untuk windows
Thiago Cardoso
Saya dapat mengonfirmasi bahwa ini berfungsi dengan hyper gitbash juga pada opsi pertama
Andy
Backticks adalah cara yang kurang efisien untuk menjalankan perintah yang disematkan. Cara yang lebih baik adalah menggunakan $ (command) daripada`command`
Timothy c
8
  1. Buka Pengaturan di Desktop Docker (Docker untuk Windows).
  2. Pilih Drive Bersama .
  3. Pilih drive yang ingin Anda gunakan di dalam container Anda (misalnya, C).
  4. Klik Terapkan . Anda mungkin diminta untuk memberikan kredensial pengguna. Mengaktifkan drive untuk container di Windows

  5. Perintah di bawah ini sekarang harus berfungsi di PowerShell (command prompt tidak mendukung ${PWD}):

    docker run --rm -v ${PWD}:/data alpine ls /data

PENTING : jika / ketika Anda mengubah kata sandi domain Windows Anda, pemasangan akan berhenti bekerja secara diam - diam , yang -vakan berfungsi tetapi penampung tidak akan melihat folder dan file host Anda. Solusi : kembali ke Pengaturan, hapus centang pada drive bersama, Terapkan , periksa lagi, Terapkan , dan masukkan kata sandi baru saat diminta.

Paulo Merson
sumber
2

Ini milik saya yang kompatibel untuk Win10 docker-ce & Win7 docker-toolbox. Pada akhirnya pada saat saya menulis ini :).

Anda dapat memperhatikan bahwa saya lebih suka menggunakan / host_mnt / c daripada c: / karena saya terkadang mengalami masalah pada docker-ce Win 10 dengan c: /

$WIN_PATH=Convert-Path .

#Convert for docker mount to be OK on Windows10 and Windows 7 Powershell
#Exact conversion is : remove the ":" symbol, replace all "\" by "/", remove last "/" and minor case only the disk letter
#Then for Windows10, add a /host_mnt/" at the begin of string => this way : c:\Users is translated to /host_mnt/c/Users
#For Windows7, add "//" => c:\Users is translated to //c/Users
$MOUNT_PATH=(($WIN_PATH -replace "\\","/") -replace ":","").Trim("/")

[regex]$regex='^[a-zA-Z]/'
$MOUNT_PATH=$regex.Replace($MOUNT_PATH, {$args[0].Value.ToLower()})

#Win 10
if ([Environment]::OSVersion.Version -ge (new-object 'Version' 10,0)) {
$MOUNT_PATH="/host_mnt/$MOUNT_PATH"
}
elseif ([Environment]::OSVersion.Version -ge (new-object 'Version' 6,1)) {
$MOUNT_PATH="//$MOUNT_PATH"
}

docker run -it -v "${MOUNT_PATH}:/tmp/test" busybox ls /tmp/test
jseguillon.dll
sumber
Ingin berkomentar dan mengonfirmasi bahwa ini adalah jawaban jutaan dolar untuk Docker Toolbox di Windows Server 2012 !!!! Kerja bagus! Untuk rasa ingin tahu siapa pun, ${MOUNT_PATH}/c/Program Files/Docker Toolbox
selesaikan
2

Solusi lain untuk Git Bash yang disediakan oleh orang lain tidak berhasil untuk saya. Ternyata saat ini ada bug / batasan di Git untuk Windows. Lihat ini dan ini .

Saya akhirnya berhasil membuatnya berfungsi setelah menemukan utas GitHub ini (yang memberikan beberapa solusi tambahan jika Anda tertarik, yang mungkin berhasil untuk Anda, tetapi tidak untuk saya).

Saya akhirnya menggunakan sintaks berikut:

MSYS_NO_PATHCONV=1 docker run --rm -it -v $(pwd):/usr/src/project gcc:4.9

Perhatikan MSYS_NO_PATHCONV=1di depan dockerperintah dan $(pwd)- tanda kurung bulat, pwd huruf kecil, tidak ada tanda kutip, tidak ada garis miring terbalik.

Selain itu, saya menggunakan container Linux di Windows jika itu penting ..

Saya menguji ini di Terminal Windows baru, ConEmu dan GitBash, dan semuanya bekerja untuk saya.

pootzko
sumber
Halo, ini membantu saya akhirnya membuat ini berfungsi. Tahukah Anda mengapa kami membutuhkan MSYS_NO_PATHCONV=1opsi perintah? Jika tidak, direktori mount tujuan saya terisi dengan "c: / tools / cmder / vendor / git-for-windows"
Austin L
1

Perintah ini harus memperbaikinya.

docker run --rm -it -v ${PWD}:c:\datamirkohaaser / docker-clitools

{PWD} adalah folder host saat ini. setelah itu :adalah folder kontainer. Jika pemasangannya benar maka file akan terdaftar di direktur c:\datadi wadah.

Awan Biru
sumber
1

Anda perlu menukar semua garis miring ke belakang menjadi garis miring ke depan, jadi ubahlah

buruh pelabuhan -v C: \ my \ folder: / mountlocation ...

untuk

buruh pelabuhan -v C: / my / folder: / mountlocation ...

Saya biasanya memanggil buruh pelabuhan dari skrip cmd di mana saya ingin folder untuk dipasang relatif terhadap skrip yang saya panggil jadi di skrip itu saya melakukan ini ...

SETLOCAL

REM capture the path to this file so we can call on relative scrips
REM without having to be in this dir to do it.

REM capture the path to $0 ie this script
set mypath=%~dp0

REM strip last char
set PREFIXPATH=%mypath:~0,-1%

echo "PREFIXPATH=%PREFIXPATH%"
mkdir -p %PREFIXPATH%\my\folder\to\mount

REM swap \ for / in the path
REM because docker likes it that way in volume mounting
set PPATH=%PREFIXPATH:\=/%
echo "PPATH=%PPATH%"

REM pass all args to this script to the docker command line with %*
docker run --name mycontainername --rm -v %PPATH%/my/folder/to/mount:/some/mountpoint  myimage %*

ENDLOCAL
Karl
sumber
0

Prompt perintah ( Cmd.exe)

Saat Docker CLI digunakan dari Windows Cmd.exe, gunakan %cd%untuk memasang direktori saat ini:

echo test > test.txt
docker run --rm -v %cd%:/data busybox ls -ls /data/test.txt

Git Bash (MinGW)

Ketika CLI Docker digunakan dari Git Bash (MinGW), pemasangan direktori saat ini mungkin gagal karena konversi jalur POSIX: Volume yang dipasang pada Docker menambahkan; C ke ujung jalur jendela saat menerjemahkan dari jalur gaya linux .

Keluar dari jalur POSIX dengan mengawali dengan /

Untuk melewati konversi jalur, jalur POSIX harus diawali dengan garis miring ( /) agar memiliki garis miring ganda ( //), termasuk/$(pwd)

touch test.txt
docker run --rm -v /$(pwd):/data busybox ls -la //data/test.txt

Nonaktifkan konversi jalur

Nonaktifkan konversi jalur POSIX di Git Bash (MinGW) dengan menyetel MSYS_NO_PATHCONV=1variabel lingkungan pada tingkat perintah

touch test.txt
MSYS_NO_PATHCONV=1 docker run --rm -v $(pwd):/data busybox ls -la /data/test.txt

atau level shell (sistem)

export MSYS_NO_PATHCONV=1
touch test.txt
docker run --rm -v $(pwd):/data busybox ls -la /data/test.txt
Evgeniy Khyst
sumber
-2
docker run --rm -v /c/Users/Christian/manager/bin:/app --workdir=/app  php:7.2-cli php  app.php

Git bash

 cd /c/Users/Christian/manager
    docker run --rm -v  ${PWD}:/app  --workdir=/app  php:7.2-cli php  bin/app.php

echo ${PWD} hasil:

/ c / Pengguna / Kristen / manajer

cmd atau PowerShell

  cd C:\Users\Christian\manager

echo ${PWD} hasil:

Jalur ---- C: \ Users \ Christian \ manager

seperti yang kita lihat di cmd atau PowerShell $ {PWD} tidak akan berfungsi

Александр Рыкованов
sumber
4
Juga, dalam bahasa Inggris, harap tulis penjelasan tentang solusi Anda. Itu akan membantu melawan kesalahpahaman bahwa StackOverflow adalah layanan penulisan kode gratis.
Yunnosch