Docker 마운트 볼륨은 Linux 스타일 경로에서 변환 할 때 Windows 경로 끝에; C를 추가합니다.


88

Windows에 도커 이미지를 마운트하려고 할 때 흥미로운 점을 발견했습니다.

.sh개발자 환경 이미지를 실행하기 위해 프로젝트 폴더를 마운트 하는 스크립트를 만들었습니다 . 모든 개발자가 머신에 관계없이 실행할 수있는 하나의 스크립트를 원합니다. 그것이하는 일은 현재 프로젝트 폴더로 docker를 실행하는 것입니다.

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

괜찮아요. 이제 계획은이 스크립트를에서 호출하는 npm것이므로 현재 폴더를 기준 으로이 스크립트 가 작동하도록하고 싶습니다. 다른 버전을 사용해 보겠습니다.

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

실패 :

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.

와트. 무엇 ;C이며 어디에서 왔습니까?

그래서 나는 echo $PWD나를 준다 /d/my/project/folder.

흥미롭게도 $PWDLinux 경로 형식의 올바른 경로로 확인하고도 커가 해당 경로에서 올바른 Windows 경로로 변환하려는 것처럼 보입니다. 단, ;C갑자기 나타나는 것이 있습니다. 그리고이 \있습니다 /...

여기서 정확히 무슨 일이 일어나고 있습니까?

VSCode의 터미널 git bash 및 powershell에서 동일한 결과를 얻습니다.

업데이트 : .shVSCode의 powershell 터미널에서을 cmd.exe실행하면 git bash에서 스크립트를 실행하는 것처럼 보이는 별도의 콘솔 창이 열립니다 . 따라서 이것은 git bash 문제 일 수 있습니다.

답변:


125

그래서 약간의 추가 조사를 통해 git-bash가 도커 마운트를 망쳐 놓는 것과 관련된 세 가지 스레드를 찾았습니다.

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

git-bash가 사용하는 경로 변환에 대한 mingw의 문서를 찾아 보면 다음 구문 표를 찾을 수 있습니다. http://www.mingw.org/wiki/Posix_path_conversion

그 중 하나는 다음 형식으로 출력됩니다 x;x;C:\MinGW\msys\1.0\x.. ;C그것에 유의하십시오 . git-bash가 영리하고 구문을 채우고이 형식으로 경로를 출력하려는 ​​경우 설명 할 수 있습니다.

해결책은 by 접두사를 사용하여 경로 변환을 이스케이프하는 것입니다 /. 따라서 현재 작업 디렉토리로 git-bash에서 docker를 실행하는 작업 docker 명령 :

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

9
나는 또한 이렇게 문자열로 경로를 감싸주었습니다"/${PWD}"
Bananaapple

11
$ docker run -p 8080:3000 -v /$(pwd):/var/www -w //var/www node npm start 결국 중괄호 대신 괄호와 함께 슬래시를 사용해야한다는 것을 알게되었습니다. 또한 작업 디렉토리에는 두 개의 슬래시가 필요했습니다. 참고 :이 내가 필요한 명령입니다 인 Pluralsight의 웹 개발자를위한 도커
Andy2K11

이것은 나를 위해 일했습니다 (Windows 10 git bash에서) : docker run --name my-wordpress -v "/ $ {PWD} / wordpress": / wordpress_sources -p 80:80 -dk <image_name>
progonkpa

1
생명 구원. Windows10과 git-bash는이 게시물을 볼 때까지 docker-compose를 사용하지 않고 볼륨을 마운트하는 데 오랜 시간이 걸렸습니다. 이제 작동합니다 : docker run --rm -v /${PWD}/migrations:/flyway/sql --network xxx_default flyway. 감사합니다.
Emily

생명. 절약기. +1000000
Jonathan Tuzman

3

나에게 해결책은 단순히 /모든 경로 끝에 닫는 슬래시를 포함하는 것이었다 .

예 : 대신

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

...사용하다

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


3

POSIX 경로 변환으로 인해 Git Bash (MinGW)에서 Windows 10의 Docker 컨테이너에 현재 디렉터리를 탑재하지 못할 수 있습니다. 로 시작하는 모든 경로 /는 유효한 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

접두사를 붙여 POSIX 경로를 이스케이프합니다. /

경로 변환을 건너 뛰려면 모든 POSIX 경로 앞에를 포함하여 추가 선행 슬래시 ( /)를 붙여야합니다 /$(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에서는 경로 //data/test.txt가 변환되지 않고 Linux 셸 //(선행 이중 슬래시)에서는 무시되고 /.

경로 변환 비활성화

MSYS_NO_PATHCONV환경 변수를 사용하여 Git Bash (MinGW)에서 POSIX 경로 변환을 비활성화합니다 .

경로 변환은 명령 수준에서 비활성화 할 수 있습니다.

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

경로 변환은 셸 (또는 시스템) 수준에서 비활성화 할 수 있습니다.

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
이스케이프가 저에게 효과가 없었지만 경로 변환을 비활성화하면이 솔루션을 제공해 주셔서 감사합니다.
Chanandler Bong


0

나는 실제로 같은 문제를 겪었습니다. Git Bash를 사용하는지 여부에 따라이 명령이 작동합니다 (예로 nginx 사용).

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

물론 원하는대로 포트와 디렉토리를 지정할 수 있습니다.


0

명령 프롬프트가 아닌 git bash에서 동일한 문제가 발생했습니다. 대신 할 수 있습니다

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

0

바로 아래에서 나를 위해 일했습니다. 동적 변수를 사용하지 마십시오.

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.