【问题标题】:How do I mount a Docker volume while using a Windows host?如何在使用 Windows 主机时挂载 Docker 卷?
【发布时间】:2016-02-10 12:58:59
【问题描述】:

在 Windows 主机下安装 Docker 卷对我来说是一个巨大的痛苦,我无法让它工作。

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

FROM php:5-apache
RUN apt-get update

当我从它构建一个图像并启动一个容器时

docker build -t phisch:dev .
docker run phisch:dev

容器正常启动。

但是当我尝试挂载一个卷时,

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)

如何将/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 无法将其用作安装点。

【问题讨论】:

    标签: windows docker containers volume boot2docker


    【解决方案1】:

    / 可能被 CMD Windows shell 解释为一个选项。

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

    正如thaJeztahissue 18290 中评论的那样:

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

    This comment 提到并添加了第二个 /:

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

    即使在 docker 工具箱 msys shell 会话中,也存在问题(例如 issue 282


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

    /c/Users/phisch/dev/htdoc 安装到一个空文件夹上确实有效,但可能不会给出预期的结果,因为默认 CMD apache2-foreground 可能仍会根据/var/www 提供其内容(如果那样的话,它将没有htdocs 内容htdocs 已挂载到另一个文件夹)。

    【讨论】:

    • 在 docker 机器(ssh 会话)中运行 docker run -v /c/Users/phisch/dev/htdocs:/var/www phisch:dev,我收到与以前相同的错误消息。
    • @PhilippSchaffrath 似乎有两个错误:Container command not found or does not exist 涉及CMDENTRYPOINT。如果该命令引用了一个应该被挂载的文件,那么我们需要先解析第一个。 c:\Users\phisch\dev\htdocs 存在吗?有那个确切的情况吗?
    • 是的,这个目录存在,完全一样。这两条消息总是在一起。要么一切正常(不使用音量),要么打印两条消息。
    • @PhilippSchaffrath 您的 ENTRYPOINT 和 CMD 是什么?
    • 使用 docker-compose 挂载卷会产生完全相同的消息。
    【解决方案2】:

    我使用 Docker for Windows 和 PowerShell 并在挂载卷时使用 $PWD 来引用当前目录,这对我来说效果很好。举几个例子:

    docker run -p 2368:2368 -v $PWD/ghost:/var/lib/ghost -d ghost
    
    docker run -p 2368:2368 -v $PWD/:/var/lib/ghost -d ghost
    

    【讨论】:

    • 您也可以使用"C:\path\to\my\host\folder""//c/path/to/my/host/folder" 而不是$PWD,这样它也可以在PowerShell 以外的其他cli 中工作:)
    • @ArnovanOordt 如果你喜欢绝对路径?
    【解决方案3】:

    如果我们谈论的是 Windows 上的 Docker,那么我们必须考虑到所有容器都在 VirtualBox 上运行的事实。

    在将卷安装到容器之前,我们必须确保特定文件夹可用于 VirtualBox。

    首先要定义当前运行的Docker机器的名字,运行

    $ docker-machine.exe  active
    default
    

    其次,将共享文件夹添加到VirtualBox:

    $ VBoxManage sharedfolder add default --name "some_project" --hostpath D:\Projects\some_project
    

    第三,创建文件夹

    $ docker-machine.exe ssh default 'sudo mkdir --parents /d/projects/some_project'
    

    第四,挂载它:

    $ docker-machine.exe ssh default 'sudo mount -t vboxsf some_project /d/projects/some_project'
    

    最后,创建一个容器:

    $ docker run -v //d/projects/some_project://d/projects/some_project -d some-image_name
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-19
      • 1970-01-01
      • 1970-01-01
      • 2019-04-10
      • 1970-01-01
      • 2017-06-30
      • 1970-01-01
      • 2017-01-01
      相关资源
      最近更新 更多