prune - Montar el directorio actual como un volumen en Docker en Windows 10
docker volume prune (7)
Descripción
Estoy usando Docker versión 1.12.5 en Windows 10 a través de Hyper-V y quiero usar ejecutables de contenedor como comandos en la ruta actual.
Construí una imagen Docker que funciona bien, pero tengo un problema para montar la ruta actual.
La idea es crear un alias y
docker run --rm [...]
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:/test
como el 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''.
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 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''.
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: 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 de montar el directorio actual como un volumen en Docker en Windows 10?
- Abra la Configuración en Docker Desktop (Docker para Windows).
- Seleccione Unidades compartidas .
- Seleccione la unidad que desea usar dentro de sus contenedores (por ejemplo, C).
-
Haz clic en Aplicar . Es posible que se le solicite que proporcione credenciales de usuario.
-
El siguiente comando ahora debería funcionar en PowerShell (el símbolo del sistema no admite
${PWD}
):docker run --rm -v ${PWD}:/data alpine ls /data
Aquí está el mío, que es compatible con Win10 docker-ce y Win7 docker-toolbox. En este 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
Debes cambiar todas las barras diagonales hacia atrás para cambiarlas
docker -v C: / my / carpeta: / mountlocation ...
a
docker -v C: / mi / carpeta: / mountlocation ...
Normalmente llamo a Docker desde un script cmd donde quiero que la carpeta se monte en relación con el script 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
En la línea de comandos de Windows (
cmd
), puede montar el directorio actual de la siguiente manera:
docker run --rm -it -v %cd%:/usr/src/project gcc:4.9
En PowerShell, usa
${PWD}
, que le proporciona 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
Este comando debería arreglarlo.
docker run --rm -it -v
${PWD}:c:/data
mirkohaaser / docker-clitools
{PWD} es la carpeta actual del host.
después de
:
es la carpeta del contenedor.
Si el montaje es correcto, los archivos se enumerarán en el director
c:/data
en el contenedor.
Esto funciona para mí en PowerShell:
docker run --rm -v ${PWD}:/data alpine ls /data
Para Git Bash para Windows (en ConEmu), lo siguiente funciona para mí (para los contenedores Docker Windows):
docker run --rm -it -v `pwd -W`:c:/api microsoft/dotnet:2-runtime
Tenga en cuenta los
backticks / backquotes
alrededor de
pwd -W
!
Con todas las otras variaciones de PWD que probé, recibí:
"Error response from daemon: invalid volume specification: ..."
Actualización: Lo anterior fue para los contenedores Docker de Windows, para el uso de contenedores Linux:
docker run --rm -it -v `pwd -W`:/api -p 8080:80 microsoft/aspnetcore:2