'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]

  1. Share nfs path using docker settings

enter image description here 2. execute following command

docker run --rm -v c:/Users:/data alpine ls /data
  1. Set path in docker compose file as shown below enter image description here

  2. File copied to windows

enter image description here

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 add docker system prune --force to the above script, on a new line right after mount 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

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