Montar o diretório atual como um volume no Docker no Windows 10




(5)

  1. Abra Configurações no Docker Desktop (Docker para Windows).
  2. Selecione as unidades compartilhadas .
  3. Selecione a unidade que você deseja usar dentro de seus contêineres (por exemplo, C).
  4. Clique em Aplicar . Você pode ser solicitado a fornecer credenciais de usuário.

  5. O comando abaixo agora deve funcionar no PowerShell (o prompt de comando não suporta ${PWD} ):

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

Descrição

Estou usando o Docker versão 1.12.5 no Windows 10 via Hyper-V e quero usar executáveis ​​de contêiner como comandos no caminho atual. Eu construí uma imagem do Docker que está funcionando bem, mas eu tenho um problema para montar o caminho atual. A idéia é criar um alias e docker run --rm [...] um comando docker run --rm [...] do docker run --rm [...] para que possa ser usado em todo o sistema no diretório atual.

Configuração

Eu tenho uma unidade E com uma pasta "teste" e lá uma pasta chamada "pasta no host do Windows" para mostrar que o comando está funcionando. O Dockerfile cria o diretório /data , define-o como VOLUME e WORKDIR.

Tendo E:\test como o diretório atual no PowerShell e executando o comando do Docker com um caminho absoluto, posso ver o conteúdo de 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

Problema

Eu quero usar o diretório atual e não uma notação absoluta. Eu não pude usar o pwd no volume devido a diferentes mensagens de erro:

Tentando com ($ 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'.

Tentando com / ($ 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'.

Tentando com \ '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'.

Tentando com `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'.

Qual é a sintaxe correta da montagem do diretório atual como um volume no Docker no Windows 10?


Aqui está o meu que é compatível tanto para Win10 docker-ce e Win7 docker-toolbox. No momento em que estou escrevendo isso :).

Você pode notar que eu prefiro usar / host_mnt / c em vez de c: / porque às vezes eu encontrei problemas no docker-ce Win 10 com c: /

$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

Isso funciona para mim no PowerShell:

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

Na linha de comando do Windows ( cmd ), você pode montar o diretório atual da seguinte forma:

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

No PowerShell, você usa ${PWD} , que fornece o diretório atual:

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

No Linux:

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

Plataforma Cruzada

As opções a seguir funcionarão no PowerShell e no Linux (pelo menos no 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

Você precisa trocar todas as barras invertidas por barras, então mude

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

para

docker -v C: / minha / pasta: / mountlocation ...

Eu normalmente chamo de docker a partir de um script cmd onde eu quero que a pasta seja montada para ser relativa ao script que estou chamando então nesse script eu faço isso ...

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






docker