Docker takılı birim, Linux stili yolundan çeviri yaparken Windows yolunun sonuna; C ekler


88

Pencerelere bir docker imajı monte etmeye çalışırken bazı ilginç tuhaflıklar buldum.

.shGeliştirici ortamı imajımızı çalıştırmak için proje klasörünü bağlayan bir betik oluşturdum . Makinelerine bakılmaksızın her geliştiricinin çalıştırabileceği bir komut dosyası istiyorum. Tek yaptığı, mevcut proje klasörüyle docker çalıştırmaktır.

#!/usr/bin/env bash
docker run -it --rm -v D:\my\project\folder:/wkDir $IMAGE_TAG yarn dev

İyi çalışıyor. Şimdi plan bu betiği aramaktır npm, bu yüzden bunun mevcut klasöre göre çalışmasını istiyorum. Başka bir versiyonu deneyelim.

docker run -it --rm -v $PWD:/wkDir $IMAGE_TAG yarn dev

Şununla başarısız olur:

C:\Program Files\Docker\Docker\Resources\bin\docker.exe: Error response from 
daemon: Mount denied:
The source path "D:/my/project/folder;C"
doesn't exist and is not known to Docker.

Wat. Nereden ;Cve nereden geldi?

Ben de bunu echo $PWDbana verir /d/my/project/folder.

İlginç, bu yüzden $PWDlinux yolu biçiminde doğru yolu çözüyor ve docker bundan doğru pencere yoluna çevirmeye çalışıyor gibi görünüyor, ancak bu ;Chiçbir yerde görünmüyor. Ve \bunlar /...

Burada tam olarak ne oluyor?

VSCode'un uç bash ve powershell'de aynı sonucu alıyorum.

Güncelleme: .shVSCode'un powershell terminalinde cmd.exeçalıştırmanın, komut dosyasını git bash'da çalıştıran ayrı bir konsol penceresi açtığını fark ettim . Yani bu bir git bash sorunu olabilir.

Yanıtlar:


126

Biraz fazladan kazı yaparak, git-bash docker mount'ını karıştırmakla ilgili bu üç parçacığı buldum:

https://forums.docker.com/t/weird-error-under-git-bash-msys-solved/9210 https://github.com/moby/moby/issues/24029#issuecomment-250412919

Mingw'nin git-bash'ın kullandığı yol dönüşümüyle ilgili belgelerine baktığımda, şu sözdizimi tablosunu buluyorum: http://www.mingw.org/wiki/Posix_path_conversion

Bir biçiminde verir: x;x;C:\MinGW\msys\1.0\x. Not;C . Git-bash zeki olmaya çalışıyorsa, sözdizimini doldurup bu formatta bir yol çıktısı veriyorsa, bu onu açıklar.

Çözüm, önekini kullanarak yol dönüşümünden kaçmaktır /. Dolayısıyla, docker'ı git-bash'dan mevcut çalışma diziniyle çalıştırmak için çalışan docker komutu:

docker run -it --rm -v /${PWD}:/wkDir $IMAGE_TAG yarn dev

9
Yolu ek olarak bir dizeye "/${PWD}"
sarmam gerektiğini öğrendim

11
$ docker run -p 8080:3000 -v /$(pwd):/var/www -w //var/www node npm start Sonunda baştaki eğik çizgiyi parantez yerine parantezle kullanmak zorunda olduğumu fark ettim. Ayrıca, çalışma dizini için iki satır başına ihtiyacım vardı. Bilginize: Pluralsight'ta Docker for Web Developers için
Andy2K11

Bu benim için çalıştı (Windows 10 git bash'da): docker run --name my-wordpress -v "/ $ {PWD} / wordpress": / wordpress_sources -p 80:80 -dk <image_name>
progonkpa

2
Hayat kurtarma. Windows10 ve git-bash burada, bu yazıyı görene kadar docker-compose kullanmadan birim bağlamayı denemem uzun zaman aldı. Şimdi bu çalışır: docker run --rm -v /${PWD}/migrations:/flyway/sql --network xxx_default flyway. Teşekkür ederim.
Emily

YAŞAM. TASARRUF. +1000000
Jonathan Tuzman

3

Benim için çözüm, herhangi bir yolun sonuna bir kapanış çizgisi eklemekti/ .

Örneğin

/opt/apache-atlas-2.0.0/bin/atlas_start.py

... kullan

/opt/apache-atlas-2.0.0/bin/atlas_start.py/


3

Geçerli dizini Git Bash'ten (MinGW) Windows 10'da bir Docker kapsayıcısına bağlamak, bir POSIX yolu dönüşümü nedeniyle başarısız olabilir. İle başlayan herhangi bir yol /, geçerli bir Windows yoluna dönüştürülür.

touch test.txt
docker run --rm -v $(pwd):/data busybox ls -la /data/test.txt
# ls: C:/Git/data/test.txt: No such file or directory

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

Yol dönüşümünü atlamak için, tüm POSIX yollarının önüne fazladan eğik çizgi ( /) dahil olmak üzere, önek getirilmesi gerekir /$(pwd).

touch test.txt
docker run --rm -v /$(pwd):/data busybox ls -la //data/test.txt
# -rwxr-xr-x    1 root     root             0 Jun 22 23:45 //data/test.txt

Git Bash'de yol //data/test.txtdönüştürülmez ve Linux kabuklarında //(baştaki çift eğik çizgi) yok sayılır ve aynı şekilde ele alınır /.

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

MSYS_NO_PATHCONVOrtam değişkenini kullanarak Git Bash (MinGW) içindeki POSIX yol dönüşümünü devre dışı bırakın .

Yol dönüştürme, komut düzeyinde devre dışı bırakılabilir:

touch test.txt
MSYS_NO_PATHCONV=1 docker run --rm -v $(pwd):/data busybox ls -la /data/test.txt
# -rwxr-xr-x    1 root     root             0 Jun 22 23:45 /data/test.txt

Yol dönüştürme, kabuk (veya sistem) düzeyinde devre dışı bırakılabilir:

export MSYS_NO_PATHCONV=1
touch test.txt
docker run --rm -v $(pwd):/data busybox ls -la /data/test.txt
# -rwxr-xr-x    1 root     root             0 Jun 22 23:45 /data/test.txt

2
Bu çözümü sağladığınız için teşekkürler, çünkü kaçış benim için işe yaramadı, ancak yol dönüşümünü devre dışı bırakmak işe yaradı.
Chanandler Bong

0

Aşağıdaki komutu deneyebilir misin -

docker run -it --rm -v %cd%:/wkDir $IMAGE_TAG yarn dev

0

Aslında aynı sorunu yaşadım. Git Bash kullanıp kullanmadığınıza bağlı olarak bu komut çalışır (örnek olarak nginx kullanarak):

docker container run --name kapsayıcı-adı -v `pwd -W` / html: / usr / share / nginx / html -p 8000: 80 -d nginx

tabii ki port ve dizini istediğiniz gibi belirleyebilirsiniz.


0

Komut isteminde değil git bash'da aynı sorunu yaşadım. Onun yerine yapabilirsin

docker run -it --rm -v "/${PWD}/D:\my\project\folder":/wkDir $IMAGE_TAG yarn dev

0

Düz aşağıda benim için çalıştı. sadece dinamik değişken kullanmayın.

docker run --rm -u root -p 8080:8080 -v jenkins-data/:/var/jenkins_home -v /var/run/docker.sock/:/var/run/docker.sock -v /Users/<YOUR USER NAME>/:/home jenkinsci/blueocean
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.