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

Docker

Docker Problem Overview


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.

Docker Solutions


Solution 1 - Docker

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

Solution 2 - Docker

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

Solution 3 - Docker

For me the solution was simply to include a closing slash / at end of any paths.

E.g. instead of

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

...use

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

Solution 4 - Docker

I had the same issue on git bash and not command prompt. You can instead

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

Solution 5 - Docker

Can you try below command -

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

Solution 6 - Docker

I've actually had the same issue. Depending on if you are using Git Bash this command works(using nginx as an example):

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

of course you can specify the port and directory as you desire.

Solution 7 - Docker

Straight worked for me below. just don't use dynamic variable.

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSebastian NemethView Question on Stackoverflow
Solution 1 - DockerSebastian NemethView Answer on Stackoverflow
Solution 2 - DockerEvgeniy KhystView Answer on Stackoverflow
Solution 3 - DockerolisteadmanView Answer on Stackoverflow
Solution 4 - DockerShayView Answer on Stackoverflow
Solution 5 - DockerSujay PillaiView Answer on Stackoverflow
Solution 6 - DockerObothlaleView Answer on Stackoverflow
Solution 7 - DockerUdyan ShardharView Answer on Stackoverflow