219 votes

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

Description

J'utilise la version 1.12.5 de Docker sur Windows 10 via Hyper-V et je veux utiliser les exécutables du conteneur comme commandes dans le chemin actuel. J'ai construit une image Docker qui fonctionne bien, mais j'ai un problème pour monter le chemin actuel. L'idée est de créer un alias et de faire un docker run --rm [...] afin qu'elle puisse être utilisée par tout le système dans le répertoire courant.

Configuration

J'ai un lecteur E avec un dossier "test" et dans celui-ci un dossier appelé "dossier sur l'hôte Windows" pour montrer que la commande fonctionne. Le Dockerfile crée le répertoire /data Il est défini comme VOLUME et WORKDIR.

Avoir E:\test comme répertoire courant dans PowerShell et en exécutant la commande Docker avec un chemin absolu, je peux voir le contenu du fichier 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 des 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 ?

0 votes

Comme décrit par d'autres, la solution est soit d'utiliser %cd% ou pour revenir à PowerShell plutôt qu'à la console standard de Windows. Toutefois, cela met en évidence le fait que Docker présente une lacune fondamentale. L'objectif du framework est d'agir comme un cadre indépendant de la plateforme pour les développeurs. Le fait que vous ayez besoin de différentes configurations pour différentes plates-formes sape plutôt ce principe.

512voto

ETL Points 1520

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

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

Dans PowerShell, vous utilisez ${PWD} qui vous donne le répertoire courant :

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 fonctionnent à 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

2 votes

Votre exemple pour CMD est correct et fonctionne parfaitement ! 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

4 votes

${PWD} fonctionne également sur les systèmes Unix (Linux, macOS). Note : pwd = répertoire de travail actuel

0 votes

Existe-t-il une solution multiplateforme pour cela ? J'essaie de créer un flux de développement automatisé qui exécute un conteneur. Le site documentation utilise ${PWD} también.

29voto

friism Points 11330

Cela fonctionne pour moi dans PowerShell :

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

5 votes

Est-ce encore valable ? J'obtiens le résultat suivant en essayant : 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'.

0 votes

@mistalaba Si vous utilisez Windows 10, essayez d'utiliser Docker for Windows au lieu de Toolbox .

2 votes

@finlay-roelofs Merci, mais Docker pour Win ne fonctionne qu'avec Win Pro.

12voto

ToastedSoul Points 525

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 le backticks/rétro-citations autour de pwd -W !

Avec toutes les autres variations de PWD que j'ai essayé, 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

0 votes

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

0 votes

Je l'ai fait, y compris les backticks, et cela a bien fonctionné avec gitbash pour Windows.

0 votes

Je peux confirmer que cela fonctionne aussi avec hyper gitbash pour la première option.

2voto

Karl Points 451

Vous devez remplacer tous les slashs arrière par des slashs avant donc changez

docker -v C:\my\folder :/mountlocation ...

à

docker -v C:/my/folder:/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

0 votes

Ma solution est similaire, mais plus courte et peut être exécutée directement dans la console : set pwd=%cd:C:\=//c/% & set pwd=%pwd:\=/% docker run -v %pwd%:/app alpine ls /app

0 votes

Bien, je vais emprunter ça :-)

1voto

Blue Clouds Points 322

Cette commande devrait le réparer.

docker run --rm -it -v ${PWD}:c:\data mirkohaaser/docker-clitools

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X