Wolumin zamontowany w Dockerze dodaje; C do końca ścieżki okna podczas tłumaczenia ze ścieżki w stylu linux

88

Przy próbie zamontowania obrazu Dockera w systemie Windows znalazłem kilka interesujących dziwactw.

Stworzyłem .shskrypt, który wykonuje montowanie folderu projektu, aby uruchomić nasz obraz środowiska deweloperskiego. Potrzebuję jednego skryptu, który może uruchomić każdy programista, niezależnie od komputera. Wszystko, co robi, to uruchamia docker z bieżącym folderem projektu.

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

Działa dobrze. Teraz planujemy wywołać ten skrypt z npm, więc chciałbym, aby działał on względem bieżącego folderu. Wypróbujmy inną wersję.

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

Zawodzi z:

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. Co ;Ci skąd się wzięło?

Więc robię, echo $PWDco mi daje /d/my/project/folder.

Interesujące, więc $PWDrozpoznaje poprawną ścieżkę w formacie ścieżki Linuksa i wygląda na to, że docker próbuje przetłumaczyć ją na właściwą ścieżkę okna, z wyjątkiem tego, ;Cże pojawia się znikąd. A \/...

Co tu się właściwie dzieje?

Otrzymuję ten sam wynik w terminalowym git bash i PowerShell VSCode.

Aktualizacja: Zauważyłem, że uruchomienie .shterminalu PowerShell w VSCode otwiera osobne cmd.exeokno konsoli, które wydaje się uruchamiać skrypt w git bash. Więc może to być problem z git bash.

Sebastian Nemeth
źródło

Odpowiedzi:

125

Więc po kilku dodatkowych kopiach znalazłem te trzy wątki, związane z git-bash zepsuciem montowania dockera:

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

Kiedy przeglądam dokumentację mingw dotyczącą konwersji ścieżek używanej przez git-bash, znajduję tę tabelę składni: http://www.mingw.org/wiki/Posix_path_conversion

Z których jeden przesyła w formacie: x;x;C:\MinGW\msys\1.0\x. Zwróć uwagę na ;Cto. Jeśli git-bash próbuje być sprytny, upychając składnię i wyświetlając ścieżkę w tym formacie, to by to wyjaśniło.

Rozwiązaniem jest uniknięcie konwersji ścieżki, używając przedrostka z /. A więc działające polecenie docker do uruchomienia dockera z git-bash z obecnym katalogiem roboczym:

docker run -it --rm -v /${PWD}:/wkDir $IMAGE_TAG yarn dev
Sebastian Nemeth
źródło
9
Okazało się, że muszę dodatkowo zawinąć ścieżkę w sznurek, więc"/${PWD}"
Bananaapple
11
$ docker run -p 8080:3000 -v /$(pwd):/var/www -w //var/www node npm start W końcu stwierdziłem, że zamiast nawiasów klamrowych musiałem użyć wiodącego ukośnika z nawiasami. Ponadto w katalogu roboczym potrzebowałem dwóch wiodących ukośników. FYI: to jest polecenie, którego potrzebowałem dla Dockera dla programistów sieci Web w Pluralsight
Andy2K11
To zadziałało dla mnie (na Windows 10 git bash): docker run --name my-wordpress -v "/ $ {PWD} / wordpress": / wordpress_sources -p 80:80 -dk <image_name>
progonkpa
1
Ratujący życie. Windows10 i git-bash zajęło mi dużo czasu, zanim spróbowałem zamontować wolumin bez użycia docker-compose, dopóki nie zobaczyłem tego postu. Teraz to działa: docker run --rm -v /${PWD}/migrations:/flyway/sql --network xxx_default flyway. Dziękuję Ci.
Emily
ŻYCIE. OSZCZĘDNOŚĆ. +1000000
Jonathan Tuzman
3

Dla mnie rozwiązaniem było po prostu dodanie zamykającego ukośnika /na końcu każdej ścieżki .

Np. Zamiast

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

...posługiwać się

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

olisteadman
źródło
3

Montowanie bieżącego katalogu do kontenera Docker w systemie Windows 10 z Git Bash (MinGW) może się nie powieść z powodu konwersji ścieżki POSIX. Każda ścieżka zaczynająca się od /jest konwertowana na prawidłową ścieżkę systemu Windows.

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

Wyjdź ze ścieżek POSIX, poprzedzając je przedrostkiem /

Aby pominąć konwersję ścieżki, wszystkie ścieżki POSIX muszą być poprzedzone dodatkowym wiodącym ukośnikiem ( /), w tym /$(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

W Git Bash ścieżka //data/test.txtnie jest konwertowana, aw powłokach Linuksa //(wiodący podwójny ukośnik) jest ignorowana i traktowana tak samo jak /.

Wyłącz konwersję ścieżki

Wyłącz konwersję ścieżki POSIX w Git Bash (MinGW) przy użyciu MSYS_NO_PATHCONVzmiennej środowiskowej.

Konwersję ścieżki można wyłączyć na poziomie poleceń:

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

Konwersję ścieżki można wyłączyć na poziomie powłoki (lub systemu):

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
Evgeniy Khyst
źródło
2
Dziękuję za udostępnienie tego rozwiązania, ponieważ ucieczka nie działa dla mnie, podczas gdy wyłączenie konwersji ścieżki tak.
Chanandler Bong
0

Czy możesz spróbować poniższe polecenie -

docker run -it --rm -v %cd%:/wkDir $IMAGE_TAG yarn dev
Sujay Pillai
źródło
0

Właściwie miałem ten sam problem. W zależności od tego, czy używasz Git Bash, to polecenie działa (na przykładzie nginx):

docker container run --name nazwa-kontenera -v `pwd -W` / html: / usr / share / nginx / html -p 8000: 80 -d nginx

oczywiście możesz określić port i katalog według własnego uznania.

Obothlale
źródło
0

Miałem ten sam problem w git bash, a nie w wierszu polecenia. Możesz zamiast tego

docker run -it --rm -v "/${PWD}/D:\my\project\folder":/wkDir $IMAGE_TAG yarn dev
Shay
źródło
0

Prosto pracował dla mnie poniżej. po prostu nie używaj zmiennej dynamicznej.

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
Udyan Shardhar
źródło