【问题标题】:Docker Volume not mounting any filesDocker Volume 没有挂载任何文件
【发布时间】:2016-04-02 22:20:03
【问题描述】:

我正在尝试将我的源文件挂载到位于 /var/dynamo 的 docker 目录中。我希望能够在本地运行 Docker 并在工作时使用我的本地文件。

使用运行命令:

docker run -v $(pwd):/var/dynamo -d -t -p 8001:8001 --name dynamo davesrepo/dynamo

用我的 Dockerfile

FROM python:3.5.1
WORKDIR /var/dynamo
RUN pip3 install tornado
EXPOSE 8001

但是,当我 bash 进入容器 docker exec -it dynamo /bin/bash 并运行 ls -la 时,目录是空的!

root@7d3d338891aa:/var/dynamo# ls -la
total 4
drwxr-xr-x  2 root root   40 Dec 29 03:37 .
drwxr-xr-x 24 root root 4096 Dec 29 03:36 ..

运行docker inspect dynamo 显示目录已正确挂载

[
{
    "Id": "7d3d338891aae32e001a3bb31d6be17802d238526830396472b011599a97212a",
    "Created": "2015-12-29T03:37:01.416445958Z",
    "Path": "python3",
    "Args": [],
    "State": {
        "Status": "running",
        "Running": true,
        "Paused": false,
        "Restarting": false,
        "OOMKilled": false,
        "Dead": false,
        "Pid": 1314,
        "ExitCode": 0,
        "Error": "",
        "StartedAt": "2015-12-29T03:37:01.516253705Z",
        "FinishedAt": "0001-01-01T00:00:00Z"
    },
    "Image": "19697c9b5c7561b113d817821280971f063ea0187c82343c0832348fb6863c9a",
    "ResolvConfPath": "/mnt/sda1/var/lib/docker/containers/7d3d338891aae32e001a3bb31d6be17802d238526830396472b011599a97212a/resolv.conf",
    "HostnamePath": "/mnt/sda1/var/lib/docker/containers/7d3d338891aae32e001a3bb31d6be17802d238526830396472b011599a97212a/hostname",
    "HostsPath": "/mnt/sda1/var/lib/docker/containers/7d3d338891aae32e001a3bb31d6be17802d238526830396472b011599a97212a/hosts",
    "LogPath": "/mnt/sda1/var/lib/docker/containers/7d3d338891aae32e001a3bb31d6be17802d238526830396472b011599a97212a/7d3d338891aae32e001a3bb31d6be17802d238526830396472b011599a97212a-json.log",
    "Name": "/dynamo",
    "RestartCount": 0,
    "Driver": "aufs",
    "ExecDriver": "native-0.2",
    "MountLabel": "",
    "ProcessLabel": "",
    "AppArmorProfile": "",
    "ExecIDs": null,
    "HostConfig": {
        "Binds": [
            "/Users/dave/Sites/davesrepo/dynamo:/var/dynamo"
        ],
        "ContainerIDFile": "",
        "LxcConf": [],
        "Memory": 0,
        "MemoryReservation": 0,
        "MemorySwap": 0,
        "KernelMemory": 0,
        "CpuShares": 0,
        "CpuPeriod": 0,
        "CpusetCpus": "",
        "CpusetMems": "",
        "CpuQuota": 0,
        "BlkioWeight": 0,
        "OomKillDisable": false,
        "MemorySwappiness": -1,
        "Privileged": false,
        "PortBindings": {
            "8001/tcp": [
                {
                    "HostIp": "",
                    "HostPort": "8001"
                }
            ]
        },
        "Links": null,
        "PublishAllPorts": false,
        "Dns": [],
        "DnsOptions": [],
        "DnsSearch": [],
        "ExtraHosts": null,
        "VolumesFrom": null,
        "Devices": [],
        "NetworkMode": "default",
        "IpcMode": "",
        "PidMode": "",
        "UTSMode": "",
        "CapAdd": null,
        "CapDrop": null,
        "GroupAdd": null,
        "RestartPolicy": {
            "Name": "no",
            "MaximumRetryCount": 0
        },
        "SecurityOpt": null,
        "ReadonlyRootfs": false,
        "Ulimits": null,
        "LogConfig": {
            "Type": "json-file",
            "Config": {}
        },
        "CgroupParent": "",
        "ConsoleSize": [
            0,
            0
        ],
        "VolumeDriver": ""
    },
    "GraphDriver": {
        "Name": "aufs",
        "Data": null
    },
    "Mounts": [
        {
            "Source": "/Users/dave/Sites/davesrepo/dynamo",
            "Destination": "/var/dynamo",
            "Mode": "",
            "RW": true
        }
    ],
    "Config": {
        "Hostname": "7d3d338891aa",
        "Domainname": "",
        "User": "",
        "AttachStdin": false,
        "AttachStdout": false,
        "AttachStderr": false,
        "ExposedPorts": {
            "8001/tcp": {}
        },
        "Tty": true,
        "OpenStdin": false,
        "StdinOnce": false,
        "Env": [
            "APP_ENV=development",
            "PYTHONPATH=$PYTHONPATH:/var/dynamo",
            "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
            "LANG=C.UTF-8",
            "PYTHON_VERSION=3.5.1",
            "PYTHON_PIP_VERSION=7.1.2"
        ],
        "Cmd": [
            "python3"
        ],
        "Image": "davesrepo/dynamo",
        "Volumes": null,
        "WorkingDir": "/var/dynamo",
        "Entrypoint": null,
        "OnBuild": null,
        "Labels": {},
        "StopSignal": "SIGTERM"
    },
    "NetworkSettings": {
        "Bridge": "",
        "SandboxID": "71d99a7d11908a9d1c0156fd33eb3f0ff5ef9f6697bb77103fe2caa1cf488530",
        "HairpinMode": false,
        "LinkLocalIPv6Address": "",
        "LinkLocalIPv6PrefixLen": 0,
        "Ports": {
            "8001/tcp": [
                {
                    "HostIp": "0.0.0.0",
                    "HostPort": "8001"
                }
            ]
        },
        "SandboxKey": "/var/run/docker/netns/71d99a7d1190",
        "SecondaryIPAddresses": null,
        "SecondaryIPv6Addresses": null,
        "EndpointID": "1cc99b0de89700368f31b43248c90ea45cec756712a2bd2ba2dc57293a5d0a72",
        "Gateway": "172.17.0.1",
        "GlobalIPv6Address": "",
        "GlobalIPv6PrefixLen": 0,
        "IPAddress": "172.17.0.2",
        "IPPrefixLen": 16,
        "IPv6Gateway": "",
        "MacAddress": "02:42:ac:11:00:02",
        "Networks": {
            "bridge": {
                "EndpointID": "1cc99b0de89700368f31b43248c90ea45cec756712a2bd2ba2dc57293a5d0a72",
                "Gateway": "172.17.0.1",
                "IPAddress": "172.17.0.2",
                "IPPrefixLen": 16,
                "IPv6Gateway": "",
                "GlobalIPv6Address": "",
                "GlobalIPv6PrefixLen": 0,
                "MacAddress": "02:42:ac:11:00:02"
            }
        }
    }
}
]

Docker 版本是 1.9.1

【问题讨论】:

  • 或者你想得到什么?你在/var/dynamo 里放了什么东西,然后它们就不见了?
  • 是的,我想把我的文件放在 /var/dynamo 中,但他们从来没有出现过
  • 该票仍处于打开状态,其中没有解决我的问题的建议解决方案。
  • 我找到了解决此问题的方法,无需降级。

标签: linux docker docker-compose


【解决方案1】:

我不知道这是否对任何人有帮助,但我花了大约一个小时试图弄清楚为什么挂载的目录是空的,因为我没有收到任何错误消息,而且我可以在容器中看到挂载的目录但没有任何文件。

简短回答:主机目录路径必须从 /home 开始

所以在我的 docker-compose 中,我错误地指定了以下内容:

services:
    myservice:
        build: .
        ports:
            - 8888:8888
        volumes:
          - /Desktop/subfolder/subfolder2:/app/subfolder

当主机路径应该是 /home 的完整路径时。就像是:

services:
    myservice:
        build: .
        ports:
            - 8888:8888
        volumes:
          - home/myuser/Desktop/subfolder/subfolder2:/app/subfolder

【讨论】:

  • 非常有帮助,我还是不明白为什么它不能使用相对路径。
【解决方案2】:

音量来源错误

没有其他帮助,这很容易;

如果您运行docker inspect [containername],检查“Mounts”部分并且您的卷上的source 设置不正确,如下所示:(mongodb 示例)

 "Mounts": [
  {
    "Type": "volume",
    "Name": "b1cdd07ca4d5621eda77481824e5068194023f4407ed2674ec81a1573f2d0410",
    "Source": "/var/lib/docker/volumes/b1cdd07ca4d5621eda77481824e5068194023f4407ed2674ec81a1573f2d0410/_data",
    "Destination": "/data/configdb",
    "Driver": "local",
    "Mode": "rw",
    "RW": true,
    "Propagation": ""
  }
]

手动设置

docs sourcetarget 中所述,可以手动指定卷。

volumes:
  - type: bind
    source: ./volumes/mongodb
    target: /data/db

希望结果

{
  "Type": "bind",
  "Source": "/home/username/app/backend/volumes/mongodb",
  "Destination": "/data/db",
  "Mode": "",
  "RW": true,
  "Propagation": "rprivate"
}

【讨论】:

    【解决方案3】:

    我的情况是win10 WSL ubuntu。我在 ubuntu 上安装了 docker-compose 和 docker 引擎,在 windows 上安装了 docker 桌面。 原来docker run -v $(pwd):<containerPathName> 命令必须在窗口中。

    【讨论】:

      【解决方案4】:

      检查你docker context :) 我忘了改回来。

      $ docker context use default
      

      【讨论】:

      • 这是做什么的?我如何检查当前是什么?
      • 我的环境是 windows 10 WSL ubuntu,我必须在 windows 上安装 docker desktop,docker engine,docker-compose 在 ubuntu,使用这里描述的步骤:stackoverflow.com/a/61902994/4582240
      【解决方案5】:

      我发现我更改了我的 windows 密码并且 docker 需要 windows 凭据才能挂载卷,你可以更新它的设置 > 共享驱动器。

      【讨论】:

      • 谢谢,这很有帮助。在 Windows 10 中当前版本的 docker (2.0.0.3) 中,我去了 settings > shared drives 并且必须选择驱动器,然后点击 Reset credentials,再次选择驱动器并点击 应用按钮,终于可以输入新的凭据了。
      【解决方案6】:

      我用的是 1.9,这很好用:

      Docker run  -d -t --restart=on-failure:3 -h docker_console -p 8880:80 -v ~/docker_console/var/www:/var/www --name docker_console repo/docker_console
      

      它将主机上的~/docker_console/var/www 连接到容器中的/var/www。 如果你使用目录名而不是变量怎么办?

      【讨论】:

      • 阅读接受的响应,问题是挂载在主机上的用户目录之外。
      • 您也没有正确阅读问题或接受的响应,问题是 VirtualBox 的挂载卷已移到用户目录之外,而 VirtualBox 无法做到这一点。
      【解决方案7】:

      您可能需要在Dockerfile 中包含类似的内容,重要的是VOLUME 在容器中指定mountable directories 然后只有-v $(pwd):/var/dynamo 有效

      RUN mkdir -p /var/dynamo
      VOLUME /var/dynamo
      WORKDIR /var/dynamo
      

      【讨论】:

      • 当您使用 docker 机器的 virtualbox 版本时,这将不起作用。 Virtualbox 不能以这种方式加载文件,因此 docker 机器也不能。
      • @digitaldavenyc 你没有在问题中提到任何关于 Virtualbox 的内容!
      【解决方案8】:

      Docker 和 Virtualbox 似乎在 /Users 目录之外安装卷时出现问题。解决这个问题的唯一方法是删除 docker 机器映像,将 /Users/yourname 目录正确设置为 Virtualbox 中的共享文件夹并创建一个新的 docker 机器映像。

      解决问题的步骤:

      1. docker-machine stop dev
      2. docker-machine rm dev
      3. docker-machine create --driver virtualbox dev
      4. eval "$(docker-machine env dev)"
      5. docker build -t davesrepo/dynamo -f ./Dockerfile .
      6. docker run -v $(pwd):/var/dynamo -d -t -p 8001:8001 --env-file ./dynamo.env --name dynamo davesrepo/dynamo
      7. docker exec -it dynamo /bin/bash
      8. ls

      root@42f9e47fa2de:/var/dynamo# ls Dockerfile README.md __init__.py __pycache__ bin config.ini requirements.txt seed.sql tests

      文件!

      【讨论】:

      • 我确定您找到了问题的原因:Virtualbox 中的文件夹共享限制是根本原因。但是,在此处创建机器的方式与在共享不起作用时创建机器的方式有何不同?您如何“正确地将 /Users/yourname 目录设置为共享文件夹”?或者您如何正确设置共享文件夹?
      • 最初设置 Docker 时,我将文件放在 /var/dynamo 中。这显然在 OSX 用户目录之外,据我所知,这是 Virtualbox 默认的。您可以通过打开 Virtualbox,单击 docker VM 的“设置”并选择“共享文件夹”来正确设置文件。从那里您可以双击机器文件夹并更改路径。这是非常直接的东西。
      • 终于解开了一个与此相关的谜团,我认为值得记录在这里。除了 VirtualBox 和一些提到的 'boot2docker' 之外,其他一些 docker 版本也有限制为 $HOME 的限制。我用'snap'安装了docker,经过大量时间和挫折后,通过执行'snap info docker'发现,并在描述中找到了限制。它是否能够通过命令找出这个限制是否到位?
      【解决方案9】:

      这很奇怪。我试图用我的docker 1.6.0 检查这个问题,所以我创建了一个与你的图像相似的图像:

      FROM ubuntu:utopic
      WORKDIR /var/dynamo
      EXPOSE 8001
      

      然后我将$(pwd) 挂载到容器中,并且能够在主机文件系统和容器之间交换文件:

      ➜  ololo  echo $(pwd)                                                                       
      /tmp/ololo
      ➜  ololo  ls         
      Dockerfile  kikiboi
      ➜  ololo  docker run --rm -it -v $(pwd):/var/dynamo volume_issue bash
      root@9b15875997ba:/var/dynamo# ls
      Dockerfile  kikiboi
      root@9b15875997ba:/var/dynamo# touch container_file
      root@9b15875997ba:/var/dynamo# exit
      ➜  ololo  ls
      container_file  Dockerfile  kikiboi
      

      您还需要确保主机上的/Users/dave/Sites/davesrepo/dynamo 和容器内的/var/dynamo 具有相同的inode 编号。为此使用stat 实用程序:

      ➜  ~  stat -c %i /tmp/ololo
      1835031
      ➜  ~  docker run --rm -it -v /tmp/ololo:/var/dynamo ubuntu:utopic stat -c %i /var/dynamo
      1835031
      

      【讨论】:

      • 你能解释一下stat实用程序是什么以及如何找到inode吗?
      • 这可能是较新版本的 Docker 的问题。我使用的是 1.9.1 版
      • 在您的示例中,您正在 docker 中创建一个文件以与主机共享。我不是想将文件从 docker 共享到主机……相反,从主机到 docker。看到我正在开发的变化。
      • @digitaldavenyc 我也在做同样的事情:您可以看到来自/tmp/ololo(主机)的文件仍然存在于/var/dynamo 文件夹(容器)中。可能你真的需要降级docker。我们使用1.61.7Centos 6。一切正常
      • @digitaldavenyc 你能在 GitHub 上打开一个问题吗?自 docker 1.6 以来,主机目录的挂载(允许它们在 /Users 中用于 boot2docker)不应该改变,而且我们还没有这方面的报告,所以我有兴趣对此进行调查。可能是您的设置中的某些内容。我不认为降级到旧版本应该是解决方案。
      猜你喜欢
      • 1970-01-01
      • 2020-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-23
      • 2020-09-02
      相关资源
      最近更新 更多