Mounting a Docker volume while being under a Windows host, has been a huge pain for me, and I could not get it to work.
Currently I got the following simple Dockerfile:
FROM php:5-apache
RUN apt-get update
When I build an image from it, and start a container
docker build -t phisch:dev .
docker run phisch:dev
the container starts properly.
But when I am trying to mount a volume,
docker run -v /c/Users/phisch/dev/htdocs:/var/www phisch:dev
the following message will be displayed:
C:\Users\phisch\dev>docker run -v /c/Users/phisch/dev/htdocs:/var/www phisch:dev
no such file or directory
docker: Error response from daemon: Container command not found or does not exist..
The /var/www
directory definitely exists in the container, and trying other directories does not change the result. Prepending a trailing slash to the host-side directory does not help either. (//c/Users/phisch/dev/htdocs
)
How do I mount for example /var/www
to C:/Users/phisch/dev/htdocs
?
phisch@DESKTOP-UC1LB9J MINGW64 ~/dev (master)
$ docker inspect phisch:dev
[
{
"Id": "sha256:73c1533222a905a378f12505ccbd9e9b34cde5a4b34ed008c39e23d5d58a9c91",
"RepoTags": [
"dev_web:latest",
"phisch:dev",
"phisch:dev3"
],
"RepoDigests": [],
"Parent": "sha256:d2c4149d86c4dfceaff0e9c4eb5a5d42ca7815f81dd08baad4dc8bda6db2fb10",
"Comment": "",
"Created": "2016-02-10T12:16:37.667236134Z",
"Container": "dad811f51ef3b94d9845d13a0e43ad07ccd5684ea2747b3846accdc71abeb628",
"ContainerConfig": {
"Hostname": "e06f5a03fe1f",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"80/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"PHP_INI_DIR=/usr/local/etc/php",
"PHP_EXTRA_BUILD_DEPS=apache2-dev",
"PHP_EXTRA_CONFIGURE_ARGS=--with-apxs2",
"GPG_KEYS=0BD78B5F97500D450838F95DFE857D9A90D90EC1 6E4F6AB321FDC07F2C332E3AC2BF0BC433CFC8B3",
"PHP_VERSION=5.6.18",
"PHP_FILENAME=php-5.6.18.tar.xz",
"PHP_SHA256=54dd9106c3469bc7028644d72ac140af00655420bbaaf4a742a64e9ed02ec1b0"
],
"Cmd": [
"/bin/sh",
"-c",
"apt-get update"
],
"ArgsEscaped": true,
"Image": "sha256:d2c4149d86c4dfceaff0e9c4eb5a5d42ca7815f81dd08baad4dc8bda6db2fb10",
"Volumes": null,
"WorkingDir": "/var/www/html",
"Entrypoint": null,
"OnBuild": [],
"Labels": {}
},
"DockerVersion": "1.10.0",
"Author": "",
"Config": {
"Hostname": "e06f5a03fe1f",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"80/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"PHP_INI_DIR=/usr/local/etc/php",
"PHP_EXTRA_BUILD_DEPS=apache2-dev",
"PHP_EXTRA_CONFIGURE_ARGS=--with-apxs2",
"GPG_KEYS=0BD78B5F97500D450838F95DFE857D9A90D90EC1 6E4F6AB321FDC07F2C332E3AC2BF0BC433CFC8B3",
"PHP_VERSION=5.6.18",
"PHP_FILENAME=php-5.6.18.tar.xz",
"PHP_SHA256=54dd9106c3469bc7028644d72ac140af00655420bbaaf4a742a64e9ed02ec1b0"
],
"Cmd": [
"apache2-foreground"
],
"ArgsEscaped": true,
"Image": "sha256:d2c4149d86c4dfceaff0e9c4eb5a5d42ca7815f81dd08baad4dc8bda6db2fb10",
"Volumes": null,
"WorkingDir": "/var/www/html",
"Entrypoint": null,
"OnBuild": [],
"Labels": {}
},
"Architecture": "amd64",
"Os": "linux",
"Size": 491287784,
"VirtualSize": 491287784,
"GraphDriver": {
"Name": "aufs",
"Data": null
}
}
]
It turns out the container-side directory /var/www
needs to be empty, since it had a sub-directory www
. Docker was not able to use it as a mounting point.
I use Docker for Windows with PowerShell and use
$PWD
to refer to the current directory when mounting a volume, and it works well for me. A couple of examples:It is possible the
/
is interpreted as an option by the CMD Windows shell.Try first a docker-machine ssh default, in order to open an ssh session in your VM. From there try the docker run again:
docker run -v /c/Users/phisch/dev/htdocs:/var/www phisch:dev
As commented by thaJeztah in issue 18290:
This comment mentions a&dding a second /:
Even in the docker toolbox msys shell session, there are issues (like issue 282)
After lengthy discussion, the issue was that
/var/www
had a folder in it.Mounting
/c/Users/phisch/dev/htdoc
onto an empty folder does work, but might not give the expected result, as the default CMDapache2-foreground
might still serve its content based on/var/www
(which would not havehtdocs
content if thathtdocs
is mounted onto another folder).If we are talking about Docker on Windows then we have to take in account the fact that all containers are run on VirtualBox.
Before mounting volume to a container we have to be sure that particular folder is available for VirtualBox.
Firstly, to define the name of the current running Docker machine, run
Secondly, add shared folder to VirtualBox:
Thirdly, create the folder
Fourthly, mount it:
Finally, create a container: