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.
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.
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 .
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
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
/
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 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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With