Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Docker mounted volume adds ;C to end of windows path when translating from linux style path

Tags:

docker

I've found some interesting weirdness when trying to mount a docker image on windows.

I created a .sh script that does a mount of the project folder to run our developer environment image. I want one script that every dev can run, regardless of their machine. All it does is runs docker with the current project folder.

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

Runs okay. Now the plan is to call this script from npm, so I'd like this to work relative to the current folder. Let's try another version.

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

Fails with:

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. What's ;C and where did it come from?

So I do echo $PWD which gives me /d/my/project/folder.

Interesting, so $PWD resolves to the correct path in linux path format, and it seems like docker is trying to translate from that to the correct windows path, except there's this ;C that appears out of nowhere. And the \ are /...

What exactly is going on here?

I get the same result in VSCode's terminal git bash and powershell.

Update: I noticed that running the .sh in VSCode's powershell terminal, opens a separate cmd.exe console window which seems to run the script in git bash. So this might be a git bash issue.

like image 932
Sebastian Nemeth Avatar asked May 30 '18 15:05

Sebastian Nemeth


People also ask

How does Docker volume mount work?

When you mount the volume into a container, this directory is what is mounted into the container. This is similar to the way that bind mounts work, except that volumes are managed by Docker and are isolated from the core functionality of the host machine.

What is a Docker mount path?

The source of the mount. For bind mounts, this is the path to the file or directory on the Docker daemon host. May be specified as source or src . The destination takes as its value the path where the file or directory is mounted in the container. May be specified as destination , dst , or target .


2 Answers

So with some extra digging I found these three threads, related to git-bash mucking up docker mount:

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

When I look up mingw's documentation on the path conversion git-bash is using, I find this table of syntax: http://www.mingw.org/wiki/Posix_path_conversion

One of which outputs in the format: x;x;C:\MinGW\msys\1.0\x. Note the ;C in it. If git-bash is trying to be clever, stuffing up the syntax and outputting a path with this format, this would explain it.

Solution is to escape the path conversion, using by prefixing with /. So the working docker command to run docker from git-bash with present working directory:

docker run -it --rm -v /${PWD}:/wkDir $IMAGE_TAG yarn dev 
like image 157
Sebastian Nemeth Avatar answered Sep 22 '22 07:09

Sebastian Nemeth


Mounting the current directory into a Docker container in Windows 10 from Git Bash (MinGW) may fail due to a POSIX path conversion. Any path starting with / is converted to a valid Windows path.

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 the POSIX paths by prefixing with /

To skip the path conversion, all POSIX paths have to be prefixed with the extra leading slash (/), including /$(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 

In Git Bash the path //data/test.txt is not converted and in Linux shells // (leading double slash) is ignored and treated the same way as /.

Disable the path conversion

Disable the POSIX path conversion in Git Bash (MinGW) using MSYS_NO_PATHCONV environment variable.

The path conversion can be disabled at the command level:

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 

The path conversion can be disabled at the shell (or system) level:

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 
like image 25
Evgeniy Khyst Avatar answered Sep 19 '22 07:09

Evgeniy Khyst