'Volume binding using docker compose on Windows
I recently upgraded my Docker Toolbox on Windows 10, and now my volume mounts no longer work. I've tried everything. Here is the current mount path:
volumes:
- C:\Users\Joey\Desktop\backend:/var/www/html
I receive an invalid bind mount error.
Solution 1:[1]
Use:
volumes:
- "C:/Users/Joey/Desktop/backend:/var/www/html"
Putting the whole thing in double quotes and using forward slashes worked for me. I was on windows 10 in windows 10 using Linux containers through WSL2
This answer was from Spenhouet given here.
Solution 2:[2]
- Share nfs path using docker settings
docker run --rm -v c:/Users:/data alpine ls /data
Solution 3:[3]
I think you have to set COMPOSE_CONVERT_WINDOWS_PATHS=1
, see here.
Docker Machine should do it automatically: https://github.com/docker/machine/pull/3830
Solution 4:[4]
I faced with same issue (I'm using Docker Desktop).
My steps were:
1) Place your folder under drive "C"
2) Open "Settings" in Docker Desktop -> "Shared Drives" -> "Reset Credentials" -> select drive "C" -> "Apply"
3) Open terminal and run (as proposed by Docker Desktop):docker run --rm -v c:/Users:/data alpine ls /data
4) Open your docker-compose.yml
and update path in -volumes
:
volumes:
- /data/YOUR_USERNAME/projects/my_project/jssecacerts:/usr/lib/jvm/java-1.8-openjdk/jre/lib/security/jssecacerts/
5) restart docker container
Solution 5:[5]
This solution worked for me, in docker-compose.yml :
volumes:
- c/Users/Cyril/django:/mydjango
(Windows 10 with WSL2 and Docker Desktop)
Solution 6:[6]
It seems you are using an absolute path located inside C:\Users
dir, that didn't work for me either, and if you are using Docker-Toolbox
see below.
Overview
Forwarding the ./
relative path in volumes
section will automatically get resolved by docker-compose
to the directory containing docker-compose.yml
file (for example, if your project is in %UserProfile%/my-project
then ./:/var/www/html
gets /c/Users/my-name/my-project:/var/www/html
).
The problem is that currently (using DockerToolbox-19.03.1
) only the /c/Users
directory gets shared with the Virtual-Machine (toolbox puts docker
itself in the VM, which means it has no access to your file system, except mounted shared-directories).
Conclusion
So, basically placing your project there (C:\Users\YOUR_USER_NAME
) should make ./
work.
But not even that worked for me, and we ended up with below _prepare.sh
script:
#!/bin/bash
VBoxManage='/c/Program Files/Oracle/VirtualBox/VBoxManage'
# Defines variables for later use.
ROOT=$(dirname $0)
ROOT=$(cd "$ROOT"; pwd)
MACHINE=default
PROJECT_KEY=shared-${ROOT##*/}
# Prepares machine (without calling "docker-machine stop" command).
#
if [ $(docker-machine status $MACHINE 2> /dev/null) = 'Running' ]; then
echo Unmounting volume: $ROOT
eval $(docker-machine env $MACHINE)
docker-compose down
docker-machine ssh $MACHINE <<< '
sudo umount "'$ROOT'";
'
"$VBoxManage" sharedfolder remove $MACHINE --name "$PROJECT_KEY" -transient > /dev/null 2>&1
else
docker-machine start $MACHINE
eval $(docker-machine env $MACHINE)
fi
set -euxo pipefail
"$VBoxManage" sharedfolder add $MACHINE --name "$PROJECT_KEY" --hostpath "$ROOT" -automount -transient
docker-machine ssh $MACHINE <<< '
echo Mounting volume: '$ROOT';
sudo mkdir -p "'$ROOT'";
sudo mount -t vboxsf -o uid=1000,gid=50 "'$PROJECT_KEY'" "'$ROOT'";
'
docker-compose up -d
docker-machine ssh $MACHINE
bash
Usage:
- Place a copy of it beside each project's
docker-compose.yml
file. - Run it each time the system is turned on (simply double-click it or its shortcut).
- Done! relative paths should now work even if your project is in another drive (far away and outside of
C:\Users
dir).
Note:
- With a little edit, it should work without
docker-compose
being required. - Consider running
docker system prune
to free disk-space (or simply adddocker system prune --force
to the above script, on a new line right aftermount
command).
Solution 7:[7]
If you're using the new Docker WSL2 backend, some drives may not be mounted in any WSL (and so Docker won't be able to see them either). For example, D: or E: or usb drives. See
- https://github.com/docker/for-win/issues/2151
- https://superuser.com/questions/1114341/windows-10-ubuntu-bash-shell-how-do-i-mount-other-windows-drives
To rule out this problem, try running docker-compose from a wsl
command line.
Solution 8:[8]
I solved it by replacing :
and '' in the windows path with /
at the first of the line.
to be like that:
volumes:
-/c/Users/Joey/Desktop/backend:/var/www/html
Please note: c
should be small.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | ylitc |
Solution 2 | Amit Jain |
Solution 3 | Community |
Solution 4 | Leonid Dashko |
Solution 5 | Cyril |
Solution 6 | |
Solution 7 | jnnnnn |
Solution 8 |