El volumen montado en Docker agrega; C al final de la ruta de Windows al traducir desde la ruta de estilo Linux

88

Encontré algunas rarezas interesantes al intentar montar una imagen de Docker en Windows.

Creé un .shscript que monta la carpeta del proyecto para ejecutar nuestra imagen de entorno de desarrollador. Quiero un script que todos los desarrolladores puedan ejecutar, independientemente de su máquina. Todo lo que hace es ejecutar la ventana acoplable con la carpeta del proyecto actual.

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

Funciona bien. Ahora el plan es llamar a este script desde npm, así que me gustaría que esto funcione en relación con la carpeta actual. Probemos otra versión.

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

Falla con:

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. ¿Qué es ;Cy de dónde vino?

Entonces hago lo echo $PWDque me da /d/my/project/folder.

Interesante, así que se $PWDresuelve en la ruta correcta en formato de ruta de Linux, y parece que Docker está tratando de traducir de eso a la ruta de Windows correcta, excepto que hay esto ;Cque aparece de la nada. Y \son /...

Qué está pasando aquí?

Obtengo el mismo resultado en el terminal git bash y powershell de VSCode.

Actualización: noté que al ejecutar el .shterminal de PowerShell de VSCode, se abre una cmd.exeventana de consola separada que parece ejecutar el script en git bash. Entonces esto podría ser un problema de git bash.

Sebastián Nemeth
fuente

Respuestas:

125

Entonces, con un poco de investigación adicional, encontré estos tres hilos, relacionados con git-bash arruinando el montaje de la ventana acoplable:

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

Cuando busco la documentación de mingw sobre la conversión de ruta que usa git-bash, encuentro esta tabla de sintaxis: http://www.mingw.org/wiki/Posix_path_conversion

Uno de los cuales emite en el formato: x;x;C:\MinGW\msys\1.0\x. Tenga ;Cen cuenta el en él. Si git-bash está tratando de ser inteligente, rellenando la sintaxis y generando una ruta con este formato, esto lo explicaría.

La solución es escapar de la conversión de la ruta, usando prefijando con /. Entonces, el comando de trabajo de la ventana acoplable para ejecutar la ventana acoplable desde git-bash con el directorio de trabajo actual:

docker run -it --rm -v /${PWD}:/wkDir $IMAGE_TAG yarn dev
Sebastián Nemeth
fuente
9
Descubrí que también tenía que envolver la ruta en una cadena, así que"/${PWD}"
Bananaapple
11
$ docker run -p 8080:3000 -v /$(pwd):/var/www -w //var/www node npm start Finalmente descubrí que tenía que usar la barra inclinada con paréntesis en lugar de llaves. Además, con el directorio de trabajo necesitaba dos barras inclinadas. FYI: este es el comando que necesitaba para Docker para desarrolladores web en Pluralsight
Andy2K11
Esto funcionó para mí (en Windows 10 git bash): docker run --name my-wordpress -v "/ $ {PWD} / wordpress": / wordpress_sources -p 80:80 -dk <image_name>
progonkpa
1
Salvavidas. Windows10 y git-bash aquí, me tomó mucho tiempo intentar montar el volumen sin usar docker-compose, hasta que veo esta publicación. Ahora bien, esto funciona: docker run --rm -v /${PWD}/migrations:/flyway/sql --network xxx_default flyway. Gracias.
Emily
VIDA. AHORRADOR. +1000000
Jonathan Tuzman
3

Para mí, la solución fue simplemente incluir una barra de cierre /al final de cualquier ruta .

Por ejemplo, en lugar de

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

...utilizar

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

olisteadman
fuente
3

El montaje del directorio actual en un contenedor Docker en Windows 10 desde Git Bash (MinGW) puede fallar debido a una conversión de ruta POSIX. Cualquier ruta que comience con /se convierte en una ruta válida de Windows.

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

Escape de las rutas POSIX prefijando con /

Para omitir la conversión de la ruta, todas las rutas POSIX deben tener como prefijo la barra inclinada adicional ( /), incluido /$(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

En Git Bash, la ruta //data/test.txtno se convierte y en los shells de Linux //(la barra inclinada inicial) se ignora y se trata de la misma manera que /.

Deshabilitar la conversión de ruta

Deshabilite la conversión de ruta POSIX en Git Bash (MinGW) usando MSYS_NO_PATHCONVla variable de entorno.

La conversión de ruta se puede desactivar en el nivel de comando:

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 conversión de ruta se puede desactivar en el nivel de shell (o sistema):

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
fuente
2
Gracias por proporcionar esta solución, ya que escapar no funcionó para mí, mientras que deshabilitar la conversión de ruta sí lo hizo.
Chanandler Bong
0

¿Puedes probar el siguiente comando?

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

De hecho, tuve el mismo problema. Dependiendo de si está usando Git Bash, este comando funciona (usando nginx como ejemplo):

Docker container run --name container-name -v `pwd -W` / html: / usr / share / nginx / html -p 8000: 80 -d nginx

por supuesto, puede especificar el puerto y el directorio que desee.

Obothlale
fuente
0

Tuve el mismo problema en git bash y no en el símbolo del sistema. En su lugar puedes

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

Directamente funcionó para mí a continuación. simplemente no use la variable dinámica.

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
fuente