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


132

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. Construí uma imagem Docker que está funcionando bem, mas tenho um problema para montar o caminho atual. A ideia é criar um alias e fazer um docker run --rm [...]comando para que possa ser usado em todo o sistema no diretório atual.

Configuração

Eu tenho um drive E com uma pasta "test" e nela uma pasta chamada "folder on windows host" para mostrar que o comando está funcionando. O Dockerfile cria o diretório /data, define-o como VOLUME e WORKDIR.

Tendo E:\testcomo o diretório atual no PowerShell e executando o comando 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

Desejo usar o diretório atual e não uma notação absoluta. Não consegui 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 para montar o diretório atual como um volume no Docker no Windows 10?

Respostas:


308

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

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

Seu exemplo para CMD está correto e funciona muito bem! A variante do Power Shell não funciona, embora o próprio $ pwd.path esteja correto, ele não é resolvido para o valor correto quando usado no script: gist.github.com/McGo/8924cc5b0609f13c39092554a0bef183
McGo

3
${PWD}também funciona em sistemas Unix (Linux, macOS). Nota : pwd= diretório de trabalho atual
thiagowfx

2
@cjsimon Na verdade, parece que pode haver ... parece que o PowerShell suporta $(pwd)que também funcionaria no Linux (eu acho - não testado)
ETL

13
Com Git Bash, pode ser winpty docker run -it -v "/$(pwd -W):/usr/src/project" gcc:4.9ou winpty docker run -it -v "/$(cmd //c cd):/usr/src/project" gcc:4.9.
kittaakos

1
não está funcionando para mim no Windows 10, montagem bem-sucedida, mas o diretório de destino está vazio
J. Doem

23

Isso funciona para mim no PowerShell:

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

5
Isso ainda é válido? Eu obtenho o seguinte quando tento: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 Se você estiver usando o Windows 10, tente usar em Docker for Windowsvez de Toolbox.
Finlay Roelofs

2
@ finlay-roelofs Obrigado, mas o Docker for Win só funciona com o Win Pro.
mistalaba

9

Para Git Bash para Windows (em ConEmu), o seguinte funciona para mim (para contêineres Docker Windows):

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

Observe as crases / crases ao redor pwd -W!

Com todas as outras variações de PWD que tentei, recebi: "Error response from daemon: invalid volume specification: ..."

Atualização: o acima foi para contêineres Docker Windows, para contêineres Linux usar:

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

Não funcionou para mim do cmder docker run -v pwd -W: / usr / share / data atomgraph / fuseki --file = / usr / share / data / Mokyklu_sarasas.ttl / mokyklos Arquivo não encontrado: C: / tools / cmder / vendor /git-for-windows/usr/share/data/Mokyklu_sarasas.ttl
Martynas Jusevičius

Sim, incluindo os backticks, e funcionou bem usando gitbash para windows
Thiago Cardoso

Posso confirmar que isso funciona com hyper gitbash também na primeira opção
Andy

Os backticks são uma forma menos eficiente de executar um comando embutido. A melhor maneira é usar $ (command) em vez de`command`
Timothy c

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

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

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

IMPORTANTE : se / quando você alterar sua senha de domínio do Windows, a montagem irá parar de funcionar silenciosamente , ou seja, -virá funcionar, mas o contêiner não verá suas pastas e arquivos do host. Solução : volte para Configurações, desmarque os drives compartilhados, Aplicar , marque-os novamente, Aplicar e digite a nova senha quando solicitado.


2

Aqui está o meu que é compatível com Win10 docker-ce e Win7 docker-toolbox. Pelo menos no momento estou escrevendo isto :).

Você pode notar que prefiro usar / host_mnt / c em vez de c: / porque às vezes 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

Gostaria de comentar e confirmar que esta é uma resposta de um milhão de dólares para o Docker Toolbox no Windows Server 2012 !!!! Excelente trabalho! Para a curiosidade de qualquer pessoa, ${MOUNT_PATH}resolve como/c/Program Files/Docker Toolbox
petrosmm

2

Outras soluções para Git Bash fornecidas por outros não funcionaram para mim. Aparentemente, existe atualmente um bug / limitação no Git para Windows. Veja isso e isso .

Eu finalmente consegui fazê-lo funcionar depois de encontrar este thread do GitHub (que fornece algumas soluções adicionais se você estiver interessado, que podem funcionar para você, mas não funcionou para mim).

Acabei usando a seguinte sintaxe:

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

Observe o MSYS_NO_PATHCONV=1na frente do dockercomando e $(pwd)- colchetes, pwd minúsculas, sem aspas, sem barras invertidas.

Além disso, estou usando contêineres Linux no Windows, se isso for importante.

Eu testei isso no novo Windows Terminal, ConEmu e GitBash, e todos eles funcionaram para mim.


Olá, isso me ajudou finalmente a fazer isso funcionar. Você sabe por que precisamos da MSYS_NO_PATHCONV=1opção de comando? Caso contrário, meu diretório de montagem de destino foi preenchido com "c: / tools / cmder / vendor / git-for-windows"
Austin L

1

Este comando deve corrigir isso.

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

{PWD} é a pasta atual do host. após o :é a pasta do contêiner. Se a montagem estiver correta, os arquivos serão listados no direcionador c:\datado contêiner.


1

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

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

para

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

Normalmente chamo o docker de um script cmd onde desejo que a pasta seja montada em relação 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

0

Prompt de comando ( Cmd.exe)

Quando a Docker CLI é usada no Windows Cmd.exe, use %cd%para montar o diretório atual:

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

Git Bash (MinGW)

Quando o Docker CLI é usado a partir do Git Bash (MinGW), a montagem do diretório atual pode falhar devido a uma conversão de caminho POSIX: o volume montado no Docker adiciona; C ao final do caminho do Windows ao traduzir do caminho do estilo linux .

Escape dos caminhos POSIX prefixando com /

Para pular a conversão de caminho, os caminhos POSIX devem ser prefixados com a barra ( /) para ter uma barra dupla inicial ( //), incluindo/$(pwd)

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

Desative a conversão de caminho

Desative a conversão de caminho POSIX no Git Bash (MinGW) definindo MSYS_NO_PATHCONV=1a variável de ambiente no nível de comando

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

ou nível de shell (sistema)

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

Git bash

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

echo ${PWD} resultado:

/ c / Usuários / Cristão / gerente

cmd ou PowerShell

  cd C:\Users\Christian\manager

echo ${PWD} resultado:

Caminho ---- C: \ Usuários \ Cristão \ gerente

como vemos em cmd ou PowerShell $ {PWD} não funcionará


4
Além disso, em inglês, escreva uma explicação de sua solução. Isso ajudaria a combater o equívoco de que StackOverflow é um serviço gratuito de escrita de código.
Yunnosch de
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.