Windows 10의 Docker에서 현재 디렉터리를 볼륨으로 탑재


132

기술

Hyper-V를 통해 Windows 10에서 Docker 버전 1.12.5를 사용하고 있으며 컨테이너 실행 파일을 현재 경로의 명령으로 사용하고 싶습니다. 잘 실행되는 Docker 이미지를 만들었지 만 현재 경로를 마운트하는 데 문제가 있습니다. 아이디어는 docker run --rm [...]현재 디렉토리에서 시스템 전체에서 사용할 수 있도록 별칭을 만들고 명령을 수행하는 것입니다.

설정

"test"폴더가있는 드라이브 E가 있고 그 안에 "folder on windows host"라는 폴더가있어 명령이 작동하고 있음을 보여줍니다. Dockerfile은 디렉토리를 만들고 /dataVOLUME 및 WORKDIR로 정의합니다.

E:\testPowerShell의 현재 디렉토리로와 절대 경로로 도커 명령을 실행, 나는의 내용을 볼 수 있습니다 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

문제

절대 표기법이 아닌 현재 디렉토리를 사용하고 싶습니다. 다른 오류 메시지로 인해 볼륨에서 pwd를 사용할 수 없습니다.

($ pwd)로 시도

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) 시도

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 \ ´로 시도

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`로 시도

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

Windows 10의 Docker에서 현재 디렉터리를 볼륨으로 마운트하는 올바른 구문은 무엇입니까?

답변:


308

Windows 명령 줄 ( cmd)에서 다음과 같이 현재 디렉토리를 마운트 할 수 있습니다.

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

PowerShell에서는 ${PWD}현재 디렉터리를 제공하는를 사용 합니다.

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

Linux의 경우 :

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

크로스 플랫폼

다음 옵션은 PowerShell과 Linux (최소 Ubuntu)에서 모두 작동합니다.

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에 대한 귀하의 예가 정확하고 훌륭하게 작동합니다! Power Shell 변형은 작동하지 않지만 $ pwd.path 자체는 정확하지만 스크립트에서 사용할 때 올바른 값으로 확인되지 않습니다. gist.github.com/McGo/8924cc5b0609f13c39092554a0bef183
McGo

3
${PWD}Unix 시스템에서도 작동합니다 (Linux, macOS). 참고 : pwd= 현재 작업 디렉토리
thiagowfx

2
@cjsimon 실제로있을 수있는 것처럼 보입니다 ... $(pwd)Linux에서도 작동하는 PowerShell 지원처럼 보입니다 (테스트되지 않은 것 같습니다)
ETL

13
Git Bash를 사용하면 winpty docker run -it -v "/$(pwd -W):/usr/src/project" gcc:4.9또는 winpty docker run -it -v "/$(cmd //c cd):/usr/src/project" gcc:4.9.
kittaakos

1
, 윈도우 10에 나를 위해 작업 성공하지만, 대상 디렉토리를 설치하지 비어 있습니다
J. Doem

23

이것은 PowerShell에서 나를 위해 작동합니다.

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

5
여전히 유효합니까? 시도 할 때 다음을 얻습니다.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'.
mistalaba

@mistalaba Windows 10을 사용 Docker for Windows하는 경우 Toolbox.
Finlay Roelofs

2
@ finlay-roelofs 감사합니다. 그러나 Docker for Win은 Win Pro에서만 작동합니다.
mistalaba

9

Windows 용 Git Bash (ConEmu)의 경우 다음이 저에게 적합합니다 (Docker Windows 컨테이너의 경우).

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

주변 의 역 따옴표 / 역 따옴표에 주의하십시오 pwd -W!

다른 모든 PWD 변형으로 시도해 보았습니다. "Error response from daemon: invalid volume specification: ..."

업데이트 : 위의 내용은 Docker Windows 컨테이너 용이며 Linux 컨테이너 용은 다음과 같습니다.

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

cmder docker run -v pwd -W: / usr / share / data atomgraph / fuseki --file = / usr / share / data / Mokyklu_sarasas.ttl / mokyklos 파일을 찾을 수 없음 : C : / tools / cmder / vendor /git-for-windows/usr/share/data/Mokyklu_sarasas.ttl
Martynas Jusevičius

나는 역 따옴표를 포함했고, 그것은 창문 gitbash를 사용하여 잘 작동
티아고 카르도소

나는 이것이 첫 번째 옵션에서도 하이퍼 gitbash와 함께 작동 함을 확인할 수있다
Andy

백틱은 포함 된 명령을 실행하는 덜 효율적인 방법입니다. 더 나은 방법은 대신 $ (command)를 사용하는 것입니다`command`
Timothy c

8
  1. Docker Desktop (Windows 용 Docker)에서 설정 을 엽니 다 .
  2. 공유 드라이브를 선택합니다 .
  3. 컨테이너 내부에서 사용할 드라이브 (예 : C)를 선택합니다.
  4. 적용을 클릭 합니다. 사용자 자격 증명을 제공하라는 요청을받을 수 있습니다. Windows에서 컨테이너 용 드라이브 활성화

  5. 이제 아래 명령이 PowerShell에서 작동합니다 (명령 프롬프트는를 지원하지 않음 ${PWD}).

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

중요 : Windows 도메인 암호를 변경하면 마운트가 자동으로 중지됩니다 . 즉, -v작동하지만 컨테이너 호스트 폴더 및 파일을 볼 수 없습니다 . 해결 방법 : 설정으로 돌아가서 공유 드라이브의 선택을 취소하고 적용 , 다시 확인한 다음 적용 을 클릭하고 메시지가 표시되면 새 비밀번호를 입력합니다.


2

다음은 Win10 docker-ce 및 Win7 docker-toolbox와 호환되는 내 것입니다. 당시 las에서 나는 이것을 쓰고 있습니다 :).

c : / 대신 / host_mnt / c를 사용하는 것을 선호하는 것을 알 수 있습니다. c : /와 함께 docker-ce Win 10에서 때때로 문제가 발생했기 때문입니다.

$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

이것이 Windows Server 2012의 Docker Toolbox에 대한 백만 달러의 대답이라는 것을 언급하고 확인하고 싶습니다 !!!! 훌륭합니다! 사람의 호기심를 들어, ${MOUNT_PATH}같은 결의/c/Program Files/Docker Toolbox
petrosmm

2

다른 사람들이 제공하는 Git Bash에 대한 다른 솔루션은 저에게 효과적이지 않았습니다. 분명히 현재 Windows 용 Git에는 버그 / 제한 사항이 있습니다. 참조 .

나는 마침내이 GitHub 스레드를 찾은 후 작동하도록 관리했습니다 (관심이 있다면 몇 가지 추가 솔루션을 제공합니다. 이는 작동 할 수 있지만 나에게는 그렇지 않았습니다).

결국 다음 구문을 사용했습니다.

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

주의 MSYS_NO_PATHCONV=1의 앞에 docker명령 및 $(pwd)괄호, 소문자 PWD, 따옴표, 백 슬래시를 사용하지 않고 -.

또한 중요한 경우 Windows에서 Linux 컨테이너를 사용하고 있습니다.

나는 이것을 새로운 Windows Terminal, ConEmu 및 GitBash에서 테스트했으며 모두 나를 위해 일했습니다.


안녕하세요, 마침내 이것이 작동하도록 도왔습니다. MSYS_NO_PATHCONV=1명령 옵션이 필요한 이유를 알고 있습니까? 그렇지 않으면 내 대상 마운트 디렉토리가 "c : / tools / cmder / vendor / git-for-windows"로 채워졌습니다
Austin L

1

이 명령은이를 수정해야합니다.

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

{PWD}는 호스트 현재 폴더입니다. 다음 :은 컨테이너 폴더입니다. 마운트가 올 바르면 파일이 c:\data컨테이너 의 디렉터 에 나열됩니다 .


1

모든 백 슬래시를 슬래시로 바꿔야하므로 변경하십시오

docker -v C : \ my \ folder : / mountlocation ...

docker -v C : / my / folder : / mountlocation ...

나는 일반적으로 cmd 스크립트에서 docker를 호출하여 폴더가 내가 호출하는 스크립트에 상대적으로 마운트되기를 원하므로 해당 스크립트에서 이렇게합니다 ...

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

0

명령 프롬프트 ( Cmd.exe)

Windows에서 Docker CLI를 사용하는 경우 Cmd.exe를 사용 %cd%하여 현재 디렉터리를 마운트합니다.

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

Git Bash (MinGW)

Git Bash (MinGW)에서 Docker CLI를 사용하는 경우 POSIX 경로 변환으로 인해 현재 디렉토리 마운트가 실패 할 수 있습니다. Docker 마운트 볼륨은 Linux 스타일 경로에서 변환 할 때 Windows 경로 끝에; C를 추가합니다 .

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

경로 변환을 건너 뛰려면 POSIX 경로 앞에 슬래시 ( /)를 추가하여 선행 이중 슬래시 ( //)를 포함해야합니다./$(pwd)

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

경로 변환 비활성화

MSYS_NO_PATHCONV=1명령 수준에서 환경 변수를 설정하여 Git Bash (MinGW)에서 POSIX 경로 변환을 비활성화합니다.

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

또는 셸 (시스템) 수준

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

힘내 bash

 cd /c/Users/Christian/manager
    docker run --rm -v  ${PWD}:/app  --workdir=/app  php:7.2-cli php  bin/app.php

echo ${PWD} 결과:

/ c / Users / Christian / manager

cmd 또는 PowerShell

  cd C:\Users\Christian\manager

echo ${PWD} 결과:

경로 ---- C : \ Users \ Christian \ manager

cmd 또는 PowerShell 에서 볼 수 있듯이 $ {PWD}는 작동하지 않습니다.


4
또한 솔루션에 대한 설명을 영어로 작성하십시오. 이는 StackOverflow가 무료 코드 작성 서비스라는 오해와 싸우는 데 도움이 될 것입니다.
Yunnosch
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.