Montar el directorio actual como un volumen en Docker en Windows 10

132

Descripción

Estoy usando la versión 1.12.5 de Docker en Windows 10 a través de Hyper-V y quiero usar ejecutables de contenedor como comandos en la ruta actual. Creé una imagen de Docker que funciona bien, pero tengo un problema para montar la ruta actual. La idea es crear un alias y ejecutar un docker run --rm [...]comando para que pueda usarse en todo el sistema en el directorio actual.

Preparar

Tengo una unidad E con una carpeta "prueba" y allí una carpeta llamada "carpeta en el host de Windows" para mostrar que el comando está funcionando. El Dockerfile crea el directorio /data, lo define como VOLUME y WORKDIR.

Teniendo E:\testcomo directorio actual en PowerShell y ejecutando el comando Docker con una ruta absoluta, puedo ver el contenido 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

Quiero usar el directorio actual y no una notación absoluta. No pude usar pwd en el volumen debido a diferentes mensajes de error:

Probar con ($ 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'.

Probar con / ($ 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'.

Intentando con \ ´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'.

Probar con `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'.

¿Cuál es la sintaxis correcta para montar el directorio actual como un volumen en Docker en Windows 10?

McGo
fuente

Respuestas:

308

En la línea de comandos de Windows ( cmd), puede montar el directorio actual así:

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

En PowerShell, usa ${PWD}, que le da el directorio actual:

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

En Linux:

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

Plataforma cruzada

Las siguientes opciones funcionarán tanto en PowerShell como en Linux (al 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
ETL
fuente
¡Su ejemplo de CMD es correcto y funciona muy bien! La variante de Power Shell no funciona, aunque $ pwd.path en sí es correcto, no se resuelve al valor correcto cuando se usa en el script: gist.github.com/McGo/8924cc5b0609f13c39092554a0bef183
McGo
3
${PWD}también funciona en sistemas Unix (Linux, macOS). Nota : pwd= directorio de trabajo actual
thiagowfx
2
@cjsimon En realidad parece que puede haber ... parece que los soportes de PowerShell $(pwd)también funcionarían en Linux (creo que, no probado)
ETL
13
Con Git Bash puede ser winpty docker run -it -v "/$(pwd -W):/usr/src/project" gcc:4.9o winpty docker run -it -v "/$(cmd //c cd):/usr/src/project" gcc:4.9.
kittaakos
1
no funciona para mí en Windows 10, el montaje se ha realizado correctamente pero el directorio de destino está vacío
J. Doem
23

Esto funciona para mí en PowerShell:

docker run --rm -v ${PWD}:/data alpine ls /data
friismo
fuente
5
¿Sigue esto siendo válido? Obtengo lo siguiente al intentarlo: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'.
wronglaba
@mistalaba Si está usando Windows 10, intente usar en Docker for Windowslugar de Toolbox.
Finlay Roelofs
2
@ finlay-roelofs Gracias, pero Docker para Win solo funciona con Win Pro.
wronglaba
9

Para Git Bash para Windows (en ConEmu), lo siguiente me funciona (para contenedores de Docker Windows):

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

Nota la comillas inversas / comillas inversas alrededor pwd -W!

Con todas las demás variaciones de PWD que he probado, he recibido: "Error response from daemon: invalid volume specification: ..."

Actualización: lo anterior fue para contenedores Docker Windows, para uso de contenedores Linux:

docker run --rm -it -v `pwd -W`:/api -p 8080:80 microsoft/aspnetcore:2
Alma tostada
fuente
No funcionó para mí desde cmder docker run -v pwd -W: / usr / share / data atomgraph / fuseki --file = / usr / share / data / Mokyklu_sarasas.ttl / mokyklos Archivo no encontrado: C: / tools / cmder / vendor /git-for-windows/usr/share/data/Mokyklu_sarasas.ttl
Martynas Jusevičius
Lo hice, incluidas las comillas inversas, y funcionó bien usando gitbash para Windows
Thiago Cardoso
Puedo confirmar que esto también funciona con hyper gitbash en la primera opción
Andy
Las comillas invertidas son una forma menos eficiente de ejecutar un comando incrustado. La mejor manera es usar $ (comando) en lugar de`command`
Timoteo c
8
  1. Abra Configuración en Docker Desktop (Docker para Windows).
  2. Seleccione Unidades compartidas .
  3. Seleccione la unidad que desea utilizar dentro de sus contenedores (por ejemplo, C).
  4. Haga clic en Aplicar . Es posible que se le solicite que proporcione credenciales de usuario. Habilitación de unidades para contenedores en Windows

  5. El siguiente comando debería funcionar ahora en PowerShell (el símbolo del sistema no es compatible ${PWD}):

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

IMPORTANTE : si / cuando cambia su contraseña de dominio de Windows, el montaje dejará de funcionar silenciosamente , es decir, -vfuncionará pero el contenedor no verá sus carpetas y archivos de host. Solución : vuelva a Configuración, desmarque las unidades compartidas, Aplicar , verifíquelas nuevamente, Aplicar e ingrese la nueva contraseña cuando se le solicite.

Paulo Merson
fuente
2

Aquí está el mío, que es compatible con Win10 docker-ce y Win7 docker-toolbox. Por último, en ese momento estoy escribiendo esto :).

Puede notar que prefiero usar / host_mnt / c en lugar de c: / porque a veces encontré problemas en docker-ce Win 10 con 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
jseguillon
fuente
Me gustaría comentar y confirmar que esta es una respuesta de un millón de dólares para Docker Toolbox en Windows Server 2012. ¡Excelente trabajo! Para la curiosidad de cualquiera, se ${MOUNT_PATH}resuelve como/c/Program Files/Docker Toolbox
petrosmm
2

Otras soluciones para Git Bash proporcionadas por otros no funcionaron para mí. Aparentemente, actualmente hay un error / limitación en Git para Windows. Mira esto y esto .

Finalmente logré que funcionara después de encontrar este hilo de GitHub (que proporciona algunas soluciones adicionales si está interesado, que podría funcionar para usted, pero no para mí).

Terminé usando la siguiente sintaxis:

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

Tenga MSYS_NO_PATHCONV=1en cuenta el delante del dockercomando y $(pwd)- corchetes, pwd en minúsculas, sin comillas, sin barras invertidas.

Además, estoy usando contenedores de Linux en Windows si eso importa ...

Probé esto en la nueva Terminal de Windows, ConEmu y GitBash, y todos funcionaron para mí.

pootzko
fuente
Hola, esto me ayudó finalmente a que esto funcionara. ¿Sabes por qué necesitamos la MSYS_NO_PATHCONV=1opción de comando? De lo contrario, mi directorio de montaje de destino se llenó con "c: / tools / cmder / vendor / git-for-windows"
Austin L
1

Este comando debería solucionarlo.

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

{PWD} es la carpeta actual del host. después de :está la carpeta contenedora. Si el montaje es correcto, los archivos se enumerarán en el director c:\dataen el contenedor.

Nubes azules
fuente
1

Debe cambiar todas las barras inclinadas hacia atrás por barras inclinadas hacia adelante, así que cambie

docker -v C: \ mi \ carpeta: / ubicación de montaje ...

a

docker -v C: / mi / carpeta: / ubicación de montaje ...

Normalmente llamo a Docker desde un script cmd donde quiero que la carpeta se monte para que sea relativa al script al que estoy llamando, así que en ese script hago esto ...

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
Karl
fuente
1

Símbolo del sistema ( Cmd.exe)

Cuando se usa la CLI de Docker desde Windows Cmd.exe, use %cd%para montar el directorio actual:

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

Git Bash (MinGW)

Cuando se usa la CLI de Docker desde Git Bash (MinGW), el montaje del directorio actual puede fallar debido a una conversión de ruta POSIX: el volumen montado en Docker agrega; C al final de la ruta de Windows cuando se traduce desde la ruta de estilo Linux .

Escape de las rutas POSIX prefijando con /

Para omitir la conversión de ruta, las rutas POSIX deben tener el prefijo de barra ( /) para tener una barra doble al principio ( //), incluyendo/$(pwd)

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

Deshabilitar la conversión de ruta

Deshabilite la conversión de ruta POSIX en Git Bash (MinGW) configurando MSYS_NO_PATHCONV=1la variable de entorno en el nivel de comando

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

o nivel de caparazón (sistema)

export MSYS_NO_PATHCONV=1
touch test.txt
docker run --rm -v $(pwd):/data busybox ls -la /data/test.txt
Evgeniy Khyst
fuente
-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 / Usuarios / Christian / manager

cmd o PowerShell

  cd C:\Users\Christian\manager

echo ${PWD} resultado:

Ruta ---- C: \ Users \ Christian \ manager

como vemos en cmd o PowerShell $ {PWD} no funcionará

Александр Рыкованов
fuente
4
Además, en inglés, escriba una explicación de su solución. Eso ayudaría a combatir la idea errónea de que StackOverflow es un servicio gratuito de escritura de código.
Yunnosch