[docker] Docker 마운트 볼륨은 Linux 스타일 경로에서 변환 할 때 Windows 경로 끝에; C를 추가합니다.
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
.
흥미롭게도 $PWD
Linux 경로 형식의 올바른 경로로 확인하고도 커가 해당 경로에서 올바른 Windows 경로로 변환하려는 것처럼 보입니다. 단, ;C
갑자기 나타나는 것이 있습니다. 그리고이 \
있습니다 /
…
여기서 정확히 무슨 일이 일어나고 있습니까?
VSCode의 터미널 git bash 및 powershell에서 동일한 결과를 얻습니다.
업데이트 : .sh
VSCode의 powershell 터미널에서을 cmd.exe
실행하면 git bash에서 스크립트를 실행하는 것처럼 보이는 별도의 콘솔 창이 열립니다 . 따라서 이것은 git bash 문제 일 수 있습니다.
답변
그래서 약간의 추가 조사를 통해 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
답변
나에게 해결책은 단순히 /
모든 경로 끝에 닫는 슬래시를 포함하는 것이었다 .
예 : 대신
/opt/apache-atlas-2.0.0/bin/atlas_start.py
…사용하다
/opt/apache-atlas-2.0.0/bin/atlas_start.py/
답변
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
답변
아래 명령을 시도해 볼 수 있습니까?
docker run -it --rm -v %cd%:/wkDir $IMAGE_TAG yarn dev
답변
나는 실제로 같은 문제를 겪었습니다. Git Bash를 사용하는지 여부에 따라이 명령이 작동합니다 (예로 nginx 사용).
docker container run –name container-name -v`pwd -W` / html : / usr / share / nginx / html -p 8000 : 80 -d nginx
물론 원하는대로 포트와 디렉토리를 지정할 수 있습니다.
답변
명령 프롬프트가 아닌 git bash에서 동일한 문제가 발생했습니다. 대신 할 수 있습니다
docker run -it --rm -v "/${PWD}/D:\my\project\folder":/wkDir $IMAGE_TAG yarn dev
답변
바로 아래에서 나를 위해 일했습니다. 동적 변수를 사용하지 마십시오.
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