태그 보관물: windows

windows

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

기술

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에서 현재 디렉터리를 볼륨으로 마운트하는 올바른 구문은 무엇입니까?



답변

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


답변

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

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


답변

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


답변

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

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

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

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


답변

다음은 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


답변

다른 사람들이 제공하는 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에서 테스트했으며 모두 나를 위해 일했습니다.


답변

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

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

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