Le volume monté dans Docker ajoute; C à la fin du chemin Windows lors de la traduction à partir du chemin de style Linux

88

J'ai trouvé une bizarrerie intéressante en essayant de monter une image docker sur Windows.

J'ai créé un .shscript qui fait un montage du dossier du projet pour exécuter notre image d'environnement de développeur. Je veux un script que tous les développeurs peuvent exécuter, quelle que soit leur machine. Tout ce qu'il fait, c'est exécuter le menu fixe avec le dossier de projet actuel.

#!/usr/bin/env bash
docker run -it --rm -v D:\my\project\folder:/wkDir $IMAGE_TAG yarn dev

Fonctionne bien. Maintenant, le plan est d'appeler ce script à partir npm, donc j'aimerais que cela fonctionne par rapport au dossier actuel. Essayons une autre version.

docker run -it --rm -v $PWD:/wkDir $IMAGE_TAG yarn dev

Échoue avec:

C:\Program Files\Docker\Docker\Resources\bin\docker.exe: Error response from 
daemon: Mount denied:
The source path "D:/my/project/folder;C"
doesn't exist and is not known to Docker.

Wat. De quoi ;Cet d'où vient-il?

Alors je fais echo $PWDce qui me donne /d/my/project/folder.

Intéressant, donc $PWDrésout le chemin correct au format de chemin Linux, et il semble que docker essaie de traduire de cela vers le chemin Windows correct, sauf qu'il y a cela ;Cqui apparaît de nulle part. Et le \sont /...

Que se passe-t-il exactement ici?

J'obtiens le même résultat dans les terminaux git bash et powershell de VSCode.

Mise à jour: j'ai remarqué que l'exécution du .shterminal PowerShell de VSCode ouvre une cmd.exefenêtre de console séparée qui semble exécuter le script dans git bash. Donc, cela pourrait être un problème git bash.

Sébastien Nemeth
la source

Réponses:

125

Donc, avec un peu de fouille supplémentaire, j'ai trouvé ces trois threads, liés à git-bash déblayant le montage docker:

https://forums.docker.com/t/weird-error-under-git-bash-msys-solved/9210 https://github.com/moby/moby/issues/24029#issuecomment-250412919

Quand je regarde la documentation de mingw sur la conversion de chemin que git-bash utilise, je trouve cette table de syntaxe: http://www.mingw.org/wiki/Posix_path_conversion

Dont un sortie au format: x;x;C:\MinGW\msys\1.0\x. Notez le ;Cdedans. Si git-bash essaie d'être intelligent, en remplissant la syntaxe et en produisant un chemin avec ce format, cela l'expliquerait.

La solution consiste à échapper à la conversion de chemin, en utilisant en préfixant avec /. Donc, la commande docker de travail pour exécuter docker à partir de git-bash avec le répertoire de travail actuel:

docker run -it --rm -v /${PWD}:/wkDir $IMAGE_TAG yarn dev
Sébastien Nemeth
la source
9
J'ai trouvé que je devais également enrouler le chemin dans une chaîne donc"/${PWD}"
Bananaapple
11
$ docker run -p 8080:3000 -v /$(pwd):/var/www -w //var/www node npm start J'ai finalement trouvé que je devais utiliser la barre oblique principale avec parenthèses au lieu d'accolades. De plus, avec le répertoire de travail, j'avais besoin de deux barres obliques principales. Pour info: c'est la commande dont j'avais besoin pour Docker for Web Developers sur Pluralsight
Andy2K11
Cela a fonctionné pour moi (sous Windows 10 git bash): docker run --name my-wordpress -v "/ $ {PWD} / wordpress": / wordpress_sources -p 80:80 -dk <image_name>
progonkpa
1
Sauver des vies. Windows10 et git-bash ici, m'a pris du temps pour essayer de monter le volume sans utiliser docker-compose, jusqu'à ce que je voie ce post. Maintenant cela fonctionne: docker run --rm -v /${PWD}/migrations:/flyway/sql --network xxx_default flyway. Merci.
Emily
LA VIE. ÉPARGNANT. +1000000
Jonathan
3

Pour moi, la solution était simplement d'inclure une barre oblique de fermeture /à la fin de tous les chemins .

Par exemple au lieu de

/opt/apache-atlas-2.0.0/bin/atlas_start.py

...utilisation

/opt/apache-atlas-2.0.0/bin/atlas_start.py/

olisteadman
la source
3

Le montage du répertoire actuel dans un conteneur Docker dans Windows 10 à partir de Git Bash (MinGW) peut échouer en raison d'une conversion de chemin POSIX. Tout chemin commençant par /est converti en un chemin Windows valide.

touch test.txt
docker run --rm -v $(pwd):/data busybox ls -la /data/test.txt
# ls: C:/Git/data/test.txt: No such file or directory

Échappez aux chemins POSIX en préfixant avec /

Pour ignorer la conversion de chemin, tous les chemins POSIX doivent être précédés de la barre oblique supplémentaire ( /), y compris /$(pwd).

touch test.txt
docker run --rm -v /$(pwd):/data busybox ls -la //data/test.txt
# -rwxr-xr-x    1 root     root             0 Jun 22 23:45 //data/test.txt

Dans Git Bash, le chemin //data/test.txtn'est pas converti et dans les shells Linux //(double barre oblique principale) est ignoré et traité de la même manière que /.

Désactiver la conversion de chemin

Désactivez la conversion de chemin POSIX dans Git Bash (MinGW) à l'aide de MSYS_NO_PATHCONVla variable d'environnement.

La conversion de chemin peut être désactivée au niveau de la commande:

touch test.txt
MSYS_NO_PATHCONV=1 docker run --rm -v $(pwd):/data busybox ls -la /data/test.txt
# -rwxr-xr-x    1 root     root             0 Jun 22 23:45 /data/test.txt

La conversion de chemin peut être désactivée au niveau du shell (ou du système):

export MSYS_NO_PATHCONV=1
touch test.txt
docker run --rm -v $(pwd):/data busybox ls -la /data/test.txt
# -rwxr-xr-x    1 root     root             0 Jun 22 23:45 /data/test.txt
Evgeniy Khyst
la source
2
Merci d'avoir fourni cette solution car l'échappement n'a pas fonctionné pour moi, alors que la désactivation de la conversion de chemin l'a fait.
Chanandler Bong
0

Pouvez-vous essayer la commande ci-dessous -

docker run -it --rm -v %cd%:/wkDir $IMAGE_TAG yarn dev
Sujay Pillai
la source
0

J'ai en fait eu le même problème. Selon que vous utilisez Git Bash, cette commande fonctionne (en utilisant nginx comme exemple):

conteneur docker run --name nom-conteneur -v `pwd -W` / html: / usr / share / nginx / html -p 8000: 80 -d nginx

bien sûr, vous pouvez spécifier le port et le répertoire comme vous le souhaitez.

Obothlale
la source
0

J'ai eu le même problème sur git bash et non sur l'invite de commande. Vous pouvez à la place

docker run -it --rm -v "/${PWD}/D:\my\project\folder":/wkDir $IMAGE_TAG yarn dev
Shay
la source
0

Directement travaillé pour moi ci-dessous. n'utilisez simplement pas de variable dynamique.

docker run --rm -u root -p 8080:8080 -v jenkins-data/:/var/jenkins_home -v /var/run/docker.sock/:/var/run/docker.sock -v /Users/<YOUR USER NAME>/:/home jenkinsci/blueocean
Udyan Shardhar
la source