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

132

La description

J'utilise Docker version 1.12.5 sur Windows 10 via Hyper-V et je souhaite utiliser des exécutables de conteneur comme commandes dans le chemin actuel. J'ai créé 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 d'exécuter une docker run --rm [...]commande afin qu'il puisse être utilisé à l'échelle du système dans le répertoire courant.

Installer

J'ai un lecteur E avec un dossier «test» et là-dedans un dossier appelé «dossier sur l'hôte Windows» pour montrer que la commande fonctionne. Le Dockerfile crée le répertoire /data, le définit comme VOLUME et WORKDIR.

Ayant E:\testcomme répertoire actuel dans PowerShell et exécutant 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 courant et non une notation absolue. Je n'ai pas pu 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?

McGo
la source

Réponses:

308

Dans la ligne de commande Windows ( cmd), vous pouvez monter le répertoire actuel comme ceci:

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

Sous Linux:

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

Plateforme croisée

Les options suivantes fonctionneront à la fois sur PowerShell et sur Linux (au moins 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
la source
Votre exemple pour CMD est correct et fonctionne très bien! La variante Power Shell ne fonctionne pas, bien que $ pwd.path lui-même soit correct, il n'est pas résolu à la valeur correcte lorsqu'il est utilisé dans le script: gist.github.com/McGo/8924cc5b0609f13c39092554a0bef183
McGo
3
${PWD}fonctionne également sur les systèmes Unix (Linux, macOS). Remarque : pwd= répertoire de travail actuel
thiagowfx
2
@cjsimon Il semble en fait qu'il y ait peut-être ... il semble que PowerShell prend en charge $(pwd)qui fonctionnerait également sous Linux (je pense - non testé)
ETL
13
Avec Git Bash, cela peut être soit 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
ne fonctionne pas pour moi sur Windows 10, succès de montage mais le répertoire cible est vide
J.Dem
23

Cela fonctionne pour moi dans PowerShell:

docker run --rm -v ${PWD}:/data alpine ls /data
friisme
la source
5
Est-ce toujours valable? 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'.
J'obtiens
@mistalaba Si vous utilisez Windows 10, essayez d'utiliser à la Docker for Windowsplace de Toolbox.
Finlay Roelofs
2
@ finlay-roelofs Merci, mais Docker for Win ne fonctionne qu'avec Win Pro.
mistalaba
9

Pour Git Bash pour Windows (dans ConEmu), ce qui suit fonctionne pour moi (pour les conteneurs Docker Windows):

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

Notez les backticks / backquotes autour pwd -W!

Avec toutes les autres variantes de PWD que j'ai essayées, j'ai reçu: "Error response from daemon: invalid volume specification: ..."

Mise à jour: ce qui précède était pour les conteneurs Docker Windows, pour les conteneurs Linux utiliser:

docker run --rm -it -v `pwd -W`:/api -p 8080:80 microsoft/aspnetcore:2
Âme grillée
la source
Cela n'a pas fonctionné pour moi à partir de cmder docker run -v pwd -W: / usr / share / data atomgraph / fuseki --file = / usr / share / data / Mokyklu_sarasas.ttl / mokyklos Fichier non trouvé: C: / tools / cmder / vendor /git-for-windows/usr/share/data/Mokyklu_sarasas.ttl
Martynas Jusevičius
Je l'ai fait, y compris les backticks, et cela a bien fonctionné avec gitbash pour Windows
Thiago Cardoso
Je peux confirmer que cela fonctionne également avec hyper gitbash sur la première option
Andy
Les backticks sont un moyen moins efficace d'exécuter une commande intégrée. La meilleure façon est d'utiliser $ (commande) plutôt que`command`
Timothy c
8
  1. Ouvrez les paramètres sur Docker Desktop (Docker pour Windows).
  2. Sélectionnez Shared Drives .
  3. Sélectionnez le lecteur que vous souhaitez utiliser dans vos conteneurs (par exemple, C).
  4. Cliquez sur Appliquer . Vous pouvez être invité à fournir les informations d'identification de l'utilisateur. Activation des lecteurs pour les conteneurs sous 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

IMPORTANT : si / lorsque vous modifiez le mot de passe de votre domaine Windows, le montage cessera de fonctionner en silence , c'est-à-dire -vfonctionnera mais le conteneur ne verra pas vos dossiers et fichiers hôtes. Solution : revenez à Paramètres, décochez les Drive partagés, Appliquer , vérifiez-les à nouveau, Appliquer et entrez le nouveau mot de passe lorsque vous y êtes invité.

Paulo Merson
la source
2

Voici le mien qui est compatible avec Win10 docker-ce et Win7 docker-toolbox. Au moment où j'écris ceci :).

Vous pouvez remarquer que je préfère utiliser / host_mnt / c au lieu de c: / car j'ai parfois rencontré 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
jseguillon
la source
Je voudrais commenter et confirmer qu'il s'agit d'une réponse d'un million de dollars pour Docker Toolbox sur Windows Server 2012 !!!! Excellent travail! Pour la curiosité de quiconque, se ${MOUNT_PATH}résout comme/c/Program Files/Docker Toolbox
petrosmm
2

D'autres solutions pour Git Bash fournies par d'autres n'ont pas fonctionné pour moi. Apparemment, il existe actuellement un bogue / limitation dans Git pour Windows. Voyez ceci et cela .

J'ai finalement réussi à le faire fonctionner après avoir trouvé ce fil GitHub (qui fournit des solutions supplémentaires si vous êtes intéressé, ce qui pourrait fonctionner pour vous, mais pas pour moi).

J'ai fini par utiliser la syntaxe suivante:

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

Notez le MSYS_NO_PATHCONV=1devant de la dockercommande et $(pwd)- crochets, pwd minuscules, pas de guillemets, pas de barres obliques inverses.

De plus, j'utilise des conteneurs Linux sur Windows si cela compte.

J'ai testé cela dans le nouveau terminal Windows, ConEmu et GitBash, et tous ont fonctionné pour moi.

pootzko
la source
Bonjour, cela m'a aidé à faire fonctionner cela. Savez-vous pourquoi nous avons besoin de l' MSYS_NO_PATHCONV=1option de commande? Sinon, mon répertoire de montage de destination a été rempli avec "c: / tools / cmder / vendor / git-for-windows"
Austin L
1

Cette commande devrait le corriger.

docker exécuter --rm -it -v ${PWD}:c:\datamirkohaaser / docker-clitools

{PWD} est le dossier actuel de l'hôte. après le se :trouve le dossier du conteneur. Si le montage est correct, les fichiers seront répertoriés dans le directeur c:\datadans le conteneur.

Nuages ​​bleus
la source
1

Vous devez remplacer toutes les barres obliques inverses par des barres obliques, alors changez

docker -v C: \ mon \ dossier: / mountlocation ...

à

docker -v C: / mon / dossier: / mountlocation ...

J'appelle normalement docker à partir d'un script cmd où je veux que le dossier à monter soit relatif au script que j'appelle donc dans ce script je fais ceci ...

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
la source
1

Invite de commande ( Cmd.exe)

Lorsque l'interface de ligne de commande Docker est utilisée à partir de Windows Cmd.exe, utilisez %cd%pour monter le répertoire actuel:

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

Git Bash (MinGW)

Lorsque la CLI Docker est utilisée à partir de Git Bash (MinGW), le montage du répertoire actuel peut échouer en raison d'une conversion de chemin POSIX: le volume monté sur Docker ajoute; C à la fin du chemin Windows lors de la traduction à partir du chemin de style Linux .

Échappez aux chemins POSIX en préfixant avec /

Pour ignorer la conversion de chemin, les chemins POSIX doivent être précédés de la barre oblique ( /) pour avoir une double barre oblique ( //), y compris/$(pwd)

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

Désactiver la conversion de chemin

Désactivez la conversion de chemin POSIX dans Git Bash (MinGW) en définissant MSYS_NO_PATHCONV=1la variable d'environnement au niveau de la commande

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

ou niveau shell (système)

export MSYS_NO_PATHCONV=1
touch test.txt
docker run --rm -v $(pwd):/data busybox ls -la /data/test.txt
Evgeniy Khyst
la source
-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} résultat:

/ c / Utilisateurs / Christian / manager

cmd ou PowerShell

  cd C:\Users\Christian\manager

echo ${PWD} résultat:

Chemin ---- C: \ Users \ Christian \ manager

comme nous le voyons dans cmd ou PowerShell $ {PWD} ne fonctionnera pas

Александр Рыкованов
la source
4
Aussi, en anglais, veuillez écrire une explication de votre solution. Cela aiderait à combattre l'idée fausse selon laquelle StackOverflow est un service d'écriture de code gratuit.
Yunnosch