web-dev-qa-db-fra.com

Monter le répertoire actuel en tant que volume dans Docker sous Windows 10

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?

50
McGo

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

108
ETL

Cela fonctionne pour moi dans PowerShell:

docker run --rm -v ${PWD}:/data Alpine ls /data
16
friism

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
3
ToastedSoul
  1. Ouvrez Paramètres sur Docker Desktop (Docker pour Windows).
  2. Sélectionnez Lecteurs partagés .
  3. Sélectionnez le lecteur que vous souhaitez utiliser à l'intérieur de vos conteneurs (par exemple, C).
  4. Cliquez sur Appliquer . Vous pouvez être invité à fournir des informations d'identification d'utilisateur. Enabling drives for containers on Windows

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

1
Paulo Merson

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

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. 

0
Blue Clouds

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