Windows 10'da Docker'da geçerli dizini bir birim olarak bağlayın


133

Açıklama

Windows 10 üzerinde Hyper-V üzerinden Docker 1.12.5 sürümünü kullanıyorum ve mevcut yolda komut olarak konteyner yürütülebilirlerini kullanmak istiyorum. İyi çalışan bir Docker görüntüsü oluşturdum, ancak mevcut yolu bağlamakla ilgili bir sorunum var. Buradaki fikir, bir takma ad oluşturmak docker run --rm [...]ve mevcut dizinde sistem genelinde kullanılabilmesi için bir komut vermektir.

Kurmak

Bir "test" klasörüne sahip bir E sürücüsüne sahibim ve orada komutun çalıştığını gösteren "windows ana bilgisayarındaki klasör" adlı bir klasörüm var. Dockerfile dizini oluşturur, /dataonu VOLUME ve WORKDIR olarak tanımlar.

Having E:\testPowerShell mevcut dizin olarak ve mutlak bir yol ile Docker komutu yürütürken, ben içeriğini görebilirsiniz 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

Sorun

Geçerli dizini kullanmak istiyorum, mutlak bir gösterim değil. Farklı hata mesajları nedeniyle birimde pwd kullanamadım:

($ Pwd) ile deniyor

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'.

/ ($ Pwd) ile deneniyor

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'.

\ ´pwd \ ´ ile deneniyor

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'.

"Pwd" ile deneniyor

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'.

Geçerli dizini Windows 10'da Docker'da birim olarak bağlamanın doğru sözdizimi nedir?

Yanıtlar:


309

Windows Komut Satırında ( cmd), geçerli dizini şu şekilde bağlayabilirsiniz:

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

PowerShell'de, size ${PWD}geçerli dizini veren şunu kullanırsınız:

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

Linux'ta:

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

Çapraz Platform

Aşağıdaki seçenekler hem PowerShell'de hem de Linux'ta (en azından Ubuntu) çalışacaktır:

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

CMD örneğiniz doğru ve harika çalışıyor! Power Shell varyantı çalışmıyor, ancak $ pwd.path'in kendisi doğru olsa da, komut dosyasında kullanıldığında doğru değere çözümlenmiyor: gist.github.com/McGo/8924cc5b0609f13c39092554a0bef183
McGo

3
${PWD}Unix sistemlerinde de çalışır (Linux, macOS). Not : pwd= mevcut çalışma dizini
thiagowfx

2
@cjsimon Aslında var gibi görünüyor ... $(pwd)Linux üzerinde de çalışacak PowerShell destekleri gibi görünüyor (sanırım - test edilmemiş)
ETL

13
Git Bash ile ya winpty docker run -it -v "/$(pwd -W):/usr/src/project" gcc:4.9da olabilir winpty docker run -it -v "/$(cmd //c cd):/usr/src/project" gcc:4.9.
kittaakos

1
, pencereler 10 benim için çalışan bir başarı ancak hedef dizin montaj değil boş
J. Doem

23

Bu, PowerShell'de benim için çalışıyor:

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

5
Bu hala geçerli mi? 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'.
Denerken şunu anlıyorum

@mistalaba Windows 10 kullanıyorsanız, Docker for Windowsbunun yerine kullanmayı deneyin Toolbox.
Finlay Roelofs

2
@ finlay-roelofs Teşekkürler, ancak Docker for Win yalnızca Win Pro ile çalışır.
mistalaba

9

Windows için Git Bash için (ConEmu'da), aşağıdakiler benim için çalışır (Docker Windows kapsayıcıları için):

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

Not backticks / backquotes etrafında pwd -W!

Denediğim tüm diğer PWD varyasyonları ile aldım: "Error response from daemon: invalid volume specification: ..."

Güncelleme: Yukarıdakiler, Linux kapsayıcıları için Docker Windows kapsayıcıları içindi:

docker run --rm -it -v `pwd -W`:/api -p 8080:80 microsoft/aspnetcore:2

Benim için cmder docker run -v pwd -W: / usr / share / data atomgraph / fuseki --file = / usr / share / data / Mokyklu_sarasas.ttl / mokyklos'tan çalışmadı Dosya bulunamadı: C: ​​/ tools / cmder / vendor /git-for-windows/usr/share/data/Mokyklu_sarasas.ttl
Martynas Jusevičius

Ters vuruşlar da dahil yaptım ve Windows için gitbash kullanarak iyi çalıştı
Thiago Cardoso

Bunun ilk seçenekte de hiper gitbash ile çalıştığını doğrulayabilirim
Andy

Ters işaretler, katıştırılmış bir komutu yürütmenin daha az verimli bir yoludur. Daha iyi yol $ (command) kullanmak yerine`command`
Timothy c

9
  1. Docker Desktop'ta (Windows için Docker) Ayarlar'ı açın .
  2. Ortak Sürücüler'i seçin .
  3. Konteynerlerinizin içinde kullanmak istediğiniz sürücüyü seçin (örneğin, C).
  4. Uygula'yı tıklayın . Kullanıcı kimlik bilgilerini sağlamanız istenebilir. Windows'ta kapsayıcılar için sürücüleri etkinleştirme

  5. Aşağıdaki komut şimdi PowerShell üzerinde çalışmalıdır (komut istemi desteklemez ${PWD}):

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

ÖNEMLİ : Windows etki alanı parolanızı değiştirirseniz / değiştirdiğinizde, bağlama sessizce çalışmayı durduracak , yani -vçalışacak ancak kapsayıcı , ana klasörlerinizi ve dosyalarınızı görmeyecektir. Çözüm : Ayarlar'a geri dönün, ortak drive'ların işaretini kaldırın, Uygula , tekrar kontrol edin, Uygula ve istendiğinde yeni şifreyi girin.


2

İşte hem Win10 docker-ce hem de Win7 docker-toolbox için uyumlu olan benim. Şu anda las'ta bunu yazıyorum :).

C: / yerine / host_mnt / c kullanmayı tercih ettiğimi fark edebilirsiniz çünkü bazen docker-ce Win 10'da c: / ile sorunla karşılaştım.

$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

Yorum yapmak ve bunun Windows Server 2012'de Docker Toolbox için milyon dolarlık bir cevap olduğunu onaylamak isterim !!!! Harika iş! Herkesin merakı için, şu şekilde ${MOUNT_PATH}çözülür/c/Program Files/Docker Toolbox
petrosmm

2

Başkaları tarafından sağlanan Git Bash için diğer çözümler benim için işe yaramadı. Görünüşe göre Windows için Git'te şu anda bir hata / sınırlama var. Bunu ve buna bakın .

Sonunda bu GitHub dizisini bulduktan sonra çalıştırmayı başardım (ilgileniyorsanız bazı ek çözümler sağlar, bu sizin için işe yarayabilir, ancak benim için çalışmadı).

Aşağıdaki sözdizimini kullandım:

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

Not MSYS_NO_PATHCONV=1önünde dockerkomuta ve $(pwd)yuvarlak parantez, küçük harf pwd, hiçbir tırnak, hiçbir tersbölüler -.

Ayrıca, önemliyse Windows'ta Linux kapsayıcıları kullanıyorum ..

Bunu yeni Windows Terminal, ConEmu ve GitBash'ta test ettim ve hepsi benim için çalıştı.


Merhaba, bu nihayet bunu çalıştırmama yardımcı oldu. MSYS_NO_PATHCONV=1Komut seçeneğine neden ihtiyacımız olduğunu biliyor musunuz ? Aksi takdirde, hedef bağlama dizinim "c: / tools / cmder / vendor / git-for-windows" ile doldu
Austin L

1

Bu komut onu düzeltmelidir.

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

{PWD}, ana bilgisayar geçerli klasörüdür. sonra :konteyner klasörü. Montaj doğruysa, dosyalar c:\datakapsayıcıdaki yöneticide listelenecektir .


1

Eğik çizgiler için tüm ters eğik çizgileri değiştirmelisiniz, bu yüzden değiştirin

docker -v C: \ my \ klasörüm: / mountlocation ...

için

docker -v C: / benim / klasörüm: / mountlocation ...

Normalde docker'ı bir cmd betiğinden çağırıyorum, klasörün betiğe göre bağlanmasını istediğim betiğe göre çağırıyorum, bu yüzden bu komut dosyasında bunu yapıyorum ...

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

1

Komut istemi ( Cmd.exe)

Docker CLI Windows'tan kullanıldığında , geçerli dizini bağlamak için Cmd.exekullanın %cd%:

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

Git Bash (MinGW)

Docker CLI Git Bash'den (MinGW) kullanıldığında, geçerli dizinin montajı bir POSIX yolu dönüşümü nedeniyle başarısız olabilir: Docker'a bağlı birim, linux stili yolundan çeviri yapılırken Windows yolunun sonuna; C ekler .

Önek ekleyerek POSIX yollarından çıkın /

Yol dönüşümünü atlamak için, POSIX yollarının /başında çift eğik çizgi ( //) olacak şekilde eğik çizgi ( ) eklenmelidir./$(pwd)

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

Yol dönüşümünü devre dışı bırakın

MSYS_NO_PATHCONV=1Komut düzeyinde ortam değişkenini ayarlayarak Git Bash'de (MinGW) POSIX yol dönüşümünü devre dışı bırakın

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

veya kabuk (sistem) seviyesi

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

-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} sonuç:

/ C / Users / Hıristiyan / müdür

cmd veya PowerShell

  cd C:\Users\Christian\manager

echo ${PWD} sonuç:

Yol ---- C: \ Kullanıcılar \ Christian \ yönetici

cmd'de veya PowerShell'de gördüğümüz gibi $ {PWD} çalışmayacak


4
Ayrıca, lütfen çözümünüzün bir açıklamasını İngilizce olarak yazın. Bu, StackOverflow'un ücretsiz bir kod yazma hizmeti olduğu yanılgısıyla mücadeleye yardımcı olur.
Yunnosch
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.