使用Windows主机时如何挂载Docker卷? [英] How do I mount a Docker volume while using a Windows host?

查看:72
本文介绍了使用Windows主机时如何挂载Docker卷?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在Windows主机下安装Docker卷对我来说是一个巨大的痛苦,并且我无法使其正常工作.

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.

当前,我得到了以下简单的Dockerfile:

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

容器正常启动.

但是当我尝试挂载卷时,

But when I am trying to mount a volume,

docker run -v /c/Users/phisch/dev/htdocs:/var/www phisch:dev

将显示以下消息:

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..

/var/www目录肯定存在于容器中,尝试其他目录不会更改结果.在主机端目录前添加斜杠也无济于事. (//c/Users/phisch/dev/htdocs)

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)

如何将例如/var/www装载到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
        }
    }
]

事实证明容器侧目录/var/www需要为空,因为它具有子目录www. Docker无法将其用作挂载点.

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.

推荐答案

CMD Windows Shell可能会将/解释为一个选项.

It is possible the / is interpreted as an option by the CMD Windows shell.

首先尝试使用docker-machine ssh默认设置,以便在VM中打开ssh会话.从那里尝试再次运行docker:docker run -v /c/Users/phisch/dev/htdocs:/var/www phisch:dev

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

thaJeztah 所述. issues/18290#issuecomment-160323229"rel =" noreferrer>问题18290 :

As commented by thaJeztah in issue 18290:

您可以考虑使用 docker-compose ; docker-compose允许您相对于docker-compose.yml文件的位置定义绑定安装的卷.
使用docker-compose文件可让您在单个文件中指定运行容器所需的所有选项,这使其非常适合在团队成员之间共享(即,只需运行docker-compose up -d即可使用正确的选项启动项目的所有容器).

You could consider using docker-compose; docker-compose allows you to define bind-mounted volumes relative to the location of the docker-compose.yml file.
Using a docker-compose file allows you to specify all options needed to run your containers in a single file, which makes it ideal for sharing between team members (ie, just run docker-compose up -d will start all containers for the project with the right options).

此评论提到了第二个/:

This comment mentions a&dding a second /:

docker run -v //c/Users/phisch/dev/htdocs:`/var/www` phisch:dev

即使在docker toolbox msys shell会话中,也存在一些问题(例如 issue 282 )

Even in the docker toolbox msys shell session, there are issues (like issue 282)

经过长时间的讨论,问题在于/var/www中有一个文件夹.

After lengthy discussion, the issue was that /var/www had a folder in it.

/c/Users/phisch/dev/htdoc挂载到一个空文件夹中确实可以,但是可能无法获得预期的结果,因为默认的CMD apache2-foreground可能仍基于/var/www提供其内容(如果该内容不包含htdocs htdocs已安装到另一个文件夹上.

Mounting /c/Users/phisch/dev/htdoc onto an empty folder does work, but might not give the expected result, as the default CMD apache2-foreground might still serve its content based on /var/www (which would not have htdocs content if that htdocs is mounted onto another folder).

这篇关于使用Windows主机时如何挂载Docker卷?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆