La description
J'utilise Docker version 1.12.5 sur Windows 10 via Hyper-V et souhaite utiliser les exécutables de conteneur en tant que commandes dans le chemin actuel. J'ai construit une image Docker qui fonctionne correctement, mais j'ai un problème pour monter le chemin actuel. L'idée est de créer un alias et de faire une commande docker run --rm [...]
afin qu'il puisse être utilisé à l'échelle du système dans le répertoire en cours.
Installer
J'ai un lecteur E avec un dossier "test" et dans celui-ci un dossier appelé "dossier sur Windows Host" pour montrer que la commande fonctionne. Le fichier Docker crée le répertoire /data
et le définit comme VOLUME et WORKDIR.
Avec E:\test
comme répertoire actuel dans PowerShell et l'exécution de la commande Docker avec un chemin absolu, je peux voir le contenu 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
Problème
Je veux utiliser le répertoire actuel et pas une notation absolue. Je ne pouvais pas utiliser pwd dans le volume à cause de différents messages d'erreur:
Essayer avec ($ 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'.
Essayer avec/($ 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'.
Essayer avec\´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'.
Essayer avec `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'.
Quelle est la syntaxe correcte pour monter le répertoire actuel en tant que volume dans Docker sous Windows 10?
En ligne de commande Windows (cmd
), vous pouvez monter le répertoire actuel de la manière suivante:
docker run --rm -it -v %cd%:/usr/src/project gcc:4.9
Dans PowerShell, vous utilisez ${PWD}
, qui vous donne le répertoire actuel:
docker run --rm -it -v ${PWD}:/usr/src/project gcc:4.9
Cross Platform
Les deux options suivantes fonctionneront à la fois sur PowerShell et sur Linux:
docker run --rm -it -v ${PWD}:/usr/src/project gcc:4.9
docker run --rm -it -v $(pwd):/usr/src/project gcc:4.9
Cela fonctionne pour moi dans PowerShell:
docker run --rm -v ${PWD}:/data Alpine ls /data
Pour Git Bash pour Windows (dans ConEmu), les opérations suivantes fonctionnent pour moi (pour les conteneurs Docker Windows):
docker run --rm -it -v `pwd -W`:c:/api Microsoft/dotnet:2-runtime
Notez les backticks/backcotes around pwd -W
!
J'ai essayé avec toutes les autres variantes de PWD que j'ai reçues: "Error response from daemon: invalid volume specification: ..."
Mise à jour: Ce qui précède s’applique aux conteneurs Windows de Docker. Pour les conteneurs Linux, utilisez:
docker run --rm -it -v `pwd -W`:/api -p 8080:80 Microsoft/aspnetcore:2
Cliquez sur Appliquer . Vous pouvez être invité à fournir des informations d'identification d'utilisateur.
La commande ci-dessous devrait maintenant fonctionner sur PowerShell (L'invite de commande ne prend pas en charge ${PWD}
):
docker run --rm -v ${PWD}:/data Alpine ls /data
Vous devez échanger toutes les barres obliques inversées pour les faire défilerSo change
docker -v C:\mon\dossier:/mountlocation ...
à
docker -v C:/mon/dossier:/mountlocation ...
J'appelle normalement docker depuis un script cmd où je veux que le dossier à monter soit relatif au script que j'appelle, alors dans ce script, je le fais ...
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
Cette commande devrait résoudre le problème.
docker run --rm -it -v ${PWD}:c:\data
mirkohaaser/docker-clitools
{PWD} est le dossier actuel de l'hôte. après le :
est le dossier du conteneur. Si le montage est correct, les fichiers seront listés dans le directeur c:\data
dans le conteneur.
Voici le mien qui est compatible à la fois pour Win10 docker-ce et Win7 docker-toolbox. À l'époque, j'écris ceci :).
Vous pouvez remarquer que je préfère utiliser/Host_mnt/c au lieu de c:/parce que je rencontrais parfois des problèmes sur docker-ce Win 10 avec 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