【问题标题】:How to mount a host directory in a Docker container如何在 Docker 容器中挂载主机目录
【发布时间】:2014-06-19 18:52:30
【问题描述】:

我正在尝试将主机目录挂载到 Docker 容器中,以便在主机上完成的任何更新都会反映到 Docker 容器中。

我哪里做错了。这是我所做的:

kishore$ cat Dockerfile

FROM ubuntu:trusty
RUN apt-get update
RUN apt-get -y install git curl vim
CMD ["/bin/bash"]
WORKDIR /test_container
VOLUME ["/test_container"]

kishore$ tree
.
├── Dockerfile
└── main_folder
    ├── tfile1.txt
    ├── tfile2.txt
    ├── tfile3.txt
    └── tfile4.txt

1 directory, 5 files kishore$ pwd /Users/kishore/tdock

kishore$ docker build --tag=k3_s3:latest .

Uploading context 7.168 kB
Uploading context
Step 0 : FROM ubuntu:trusty
 ---> 99ec81b80c55
Step 1 : RUN apt-get update
 ---> Using cache
 ---> 1c7282005040
Step 2 : RUN apt-get -y install git curl vim
 ---> Using cache
 ---> aed48634e300
Step 3 : CMD ["/bin/bash"]
 ---> Running in d081b576878d
 ---> 65db8df48595
Step 4 : WORKDIR /test_container
 ---> Running in 5b8d2ccd719d
 ---> 250369b30e1f
Step 5 : VOLUME ["/test_container"]
 ---> Running in 72ca332d9809
 ---> 163deb2b1bc5
Successfully built 163deb2b1bc5
Removing intermediate container b8bfcb071441
Removing intermediate container d081b576878d
Removing intermediate container 5b8d2ccd719d
Removing intermediate container 72ca332d9809

kishore$ docker run -d -v /Users/kishore/main_folder:/test_container k3_s3:latest c9f9a7e09c54ee1c2cc966f15c963b4af320b5203b8c46689033c1ab8872a0ea

kishore$ docker run -i -t k3_s3:latest /bin/bash

root@0f17e2313a46:/test_container# ls -al
total 8
drwx------  2 root root 4096 Apr 29 05:15 .
drwxr-xr-x 66 root root 4096 Apr 29 05:15 ..

root@0f17e2313a46:/test_container# exit exit

kishore$ docker -v
Docker version 0.9.1, build 867b2a9
  • 不知道如何查看boot2docker版本

问题,面临的问题:

  1. 如何将 main_folder 链接到 docker 容器内的 test_container 文件夹?
  2. 我需要自动完成。在不真正使用run -d -v 命令的情况下如何做到这一点?
  3. 如果 boot2docker 崩溃会怎样? Docker 文件存储在哪里(Dockerfile 除外)?

【问题讨论】:

  • 仅供参考,截至本评论,这似乎已在 docker 中修复。我在我的 Mac 上使用 boot2docker。我可以使用 -v 选项,我的本地目录会一直挂载到容器中。
  • 以下答案均不符合 OP 的要求 #2。他们想从 Dockerfile 中完成,而不是 docker run 命令。我也想知道。

标签: docker mount boot2docker


【解决方案1】:

有几种方法可以做到这一点。最简单的方法是使用 dockerfile ADD 命令,如下所示:

ADD . /path/inside/docker/container

但是,在构建 dockerfile 后对主机上的此目录所做的任何更改都不会显示在容器中。这是因为在构建容器时,docker 会将目录压缩成 .tar 并将该 context 永久上传到容器中。

第二种方法是您尝试的方式,即挂载卷。由于试图尽可能便携,您不能将主机目录映射到 dockerfile 中的 docker 容器目录,因为主机目录可能会根据您运行的机器而改变。要将主机目录映射到 docker 容器目录,您需要在使用 docker run 时使用 -v 标志,例如:

# Run a container using the `alpine` image, mount the `/tmp`
# directory from your host into the `/container/directory`
# directory in your container, and run the `ls` command to
# show the contents of that directory.
docker run \
    -v /tmp:/container/directory \
    alpine \
    ls /container/directory

【讨论】:

  • 我试过这样 kishore$ docker -v /Users/kishore/main_folder:/test_container Docker version 0.9.1, build 867b2a9 kishore$ docker run -v /Users/kishore/main_folder:/test_container : docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 在新容器中运行命令 -P, --publish-all=false: 将所有暴露的端口发布到主机接口 -a, --attach=[ ]:附加到标准输入、标准输出或标准错误。 -c, --cpu-shares=0:CPU 份额(相对权重)
  • 你能同时拥有 ADD 吗?和 -v 卷同时挂载。如果不指定主机挂载,使用默认 app_dir?
  • @alexzg 我认为我们不能只优先考虑第一个。另外,我不清楚您的第二点默认 app_dir... host mount.. ?
  • 这适用于我在 mac os x 上使用 docker-machine 和 VirtualBox。我通过反复试验发现的一个警告是主机目录必须是完整路径而不是相对路径。
  • ADD 实际上并不是在“挂载”,而是将文件复制到容器中并在其中持久化。
【解决方案2】:

这个问题的用户使用Docker version 0.9.1, build 867b2a9,我会给你一个docker版本> = 17.06的答案。

你想要的,保持本地目录在容器目录中同步,是通过挂载类型为bind的卷来完成的。这将绑定源(您的系统)和目标(在 docker 容器中)目录。和在linux上挂载目录差不多。

According to Docker documentation,挂载的适当命令现在是mount,而不是-v。这是它的文档:

  • --mount:由多个键值对组成,以逗号分隔。每个键/值对都采用<key>=<value> 元组的形式。 --mount 语法比-v--volume 更冗长,但键的顺序并不重要,标志的值更容易理解。

  • 挂载的type,可以是bindvolumetmpfs(我们将使用 bind

  • 坐骑的source。对于绑定挂载,这是 Docker 守护程序主机上文件或目录的路径。可以指定为sourcesrc

  • destination 将文件或目录在容器中挂载的路径作为其值。可以指定为destinationdsttarget

所以,要使用/test_container(目标)挂载当前目录(源),我们将使用:

    docker run -it --mount src="$(pwd)",target=/test_container,type=bind k3_s3

如果这些挂载参数有空格,您必须在它们周围加上引号。当我知道他们不知道时,我会改用`pwd`

    docker run -it --mount src=`pwd`,target=/test_container,type=bind k3_s3

您还必须处理文件权限,请参阅this article

【讨论】:

  • 我赞成您的回答,因为我喜欢它的简洁性并且没有错,但您可能想根据我在stackoverflow.com/a/51829247/901899的回答对其进行一些更新
  • 我猜自这个答案以来文档已经更新,因为现在它似乎推荐卷,而不是安装。在承诺任何事情之前,值得一试。
  • @Sipty 可能指的是以下内容:“如果您正在开发新的 Docker 应用程序,请考虑改用named volumes。您不能使用 Docker CLI 命令直接管理绑定挂载。 "
  • Docker 仍然建议将绑定挂载用于开发用例:docs.docker.com/develop/dev-best-practices "在开发过程中适合使用绑定挂载的一种情况是,当您可能想要挂载源目录或二进制文件时刚刚内置到您的容器中。对于生产,请改用卷,将其安装到与您在开发期间安装绑定安装相同的位置。“
  • 这很好用,但是如何安装在现有容器上
【解决方案3】:

您可以使用 cli 中的 -v 选项,此功能无法通过 Dockerfile 获得

docker run -t -i -v <host_dir>:<container_dir> ubuntu /bin/bash

其中 host_dir 是您要挂载的主机目录。 如果容器的目录不存在,您无需担心容器的目录,docker 会创建它。

如果您从主机(在 root 权限下)对 host_dir 进行任何更改,它将对容器可见,反之亦然。

【讨论】:

  • 多么漂亮、简洁、中肯的示例来说明主机挂载选项。也许可以通过使用真实目录来改进它:docker run -t -i -v /tmp:/tmp ubuntu /bin/bash,其中主机/tmp 将安装在容器/tmp 上。现在可以从容器中touch /tmp/hello-world 看到文件出现在主机上。
  • 完美运行。但是以这种方式挂载会将目录所有者设置为 root,这也期望容器以 root 身份运行。当容器以非root身份运行时,我们如何将目录挂载为非root?
【解决方案4】:

2 次连续安装: 我猜这里的很多帖子可能使用了两个 boot2docker,你没有看到任何东西的原因是你正在从 boot2docker 挂载一个目录,而不是你的主机。

你基本上需要 2 个连续的坐骑:

第一个将目录从您的主机安装到您的系统

第二个将新目录从 boot2docker 挂载到您的容器,如下所示:

  • 1) 在boot2docker上挂载本地系统

    sudo mount -t vboxsf hostfolder /boot2dockerfolder
    
  • 2) 在linux容器上挂载boot2docker文件

    docker run -v /boot2dockerfolder:/root/containerfolder -i -t imagename
    

那么当你在containerfolder里面ls你会看到你hostfolder的内容。

【讨论】:

  • 最佳答案。我必须在 mount 命令中添加(在 Windows 下)hostfolder 是指文件夹共享名称。在 Windows 终端 (cmd) 中出现 net share 命令的那个。而且您必须将其添加为与 virtualBox GUI 的共享文件夹(如果您按照我的逻辑使用相同的名称)。如果您不分享它,它会起作用,但您将面临权限和刷新性能问题。
  • mount命令如何知道/boot2dockerfolder所在的主机?
  • 我收到错误:mount: unknown filesystem type 'vboxsf',使用 ubuntu 来宾和主机
  • "vboxsf" 是 VirtualBox 共享文件夹“文件系统”驱动程序。必须通过安装 VirtualBox 扩展将其配置到 VM 中。 boot2docker 镜像不能安装这些。 VirtualBox 具有“设备”功能,可将 VirtualBox Additions ISO 映像“插入”为虚拟卷。通常,您可以使用 mount /dev/cdrom /mnt 将其挂载到挂载上,进入 /mnt 并运行 bash VBoxLinuxAdditions。它可能需要安装 gcc、内核或其他依赖项。
  • mount.vboxsf: 挂载失败并出现错误:没有这样的文件或目录挂载:在 /boot2dockerfolder 上挂载 mymapfoldername 失败:没有这样的文件或目录
【解决方案5】:

您是否可以通过boot2docker 或类似的方式在 OS X 上使用 docker。

我也有同样的经历——命令是正确的,但无论如何,容器中没有安装任何东西(明智的)。

事实证明,docker documentation 已经对此进行了解释。当您键入 docker run -v /var/logs/on/host:/var/logs/in/container ... 时,/var/logs/on/host 实际上是从 boot2docker VM 映像映射的,而不是您的 Mac。

您必须通过 VM 将共享文件夹通过管道传输到您的实际主机(在我的情况下为 Mac)。

【讨论】:

  • 谢谢!这帮助我解决了一个相关的问题。在 Docker 中运行的 Postgres 已绑定到 VBox IP,而不是 localhost,如果不在 OS X 上运行,它就会绑定。
  • docker 文档的 URL 不再有效
  • 哈哈有史以来最好的笑话..他们真的可以暗示一下。
  • 您的文档链接是 404
  • 我很想看到一个通过 VM 将共享文件夹传送到实际主机的示例。
【解决方案6】:

我只是在尝试让我的 SailsJS 应用程序在 Docker 容器中运行,以保持我的物理机器清洁。

我正在使用以下命令将我的 SailsJS/NodeJS 应用程序挂载到 /app 下:

cd my_source_code_folder docker run -it -p 1337:1337 -v $(pwd):/app my_docker/image_with_nodejs_etc

【讨论】:

  • 如何在 Dockerfile 中做到这一点?
【解决方案7】:

[更新]截至 2017 年 6 月,Docker for Mac 负责处理您必须使用 VirtualBox 的所有烦人部分。它允许您使用 /private 前缀基本上映射本地主机上的所有内容。更多信息here[/UPDATE]

所有当前的答案都在谈论 Boot2docker。由于现在不赞成使用 docker-machine,因此这适用于 docker-machine:

首先,通过 ssh 进入 docker-machine 虚拟机并创建我们将要映射到的文件夹:

docker-machine ssh $MACHINE_NAME "sudo mkdir -p \"$VOL_DIR\""

现在将文件夹共享到 VirtualBox:

WORKDIR=$(basename "$VOL_DIR")
vboxmanage sharedfolder add "$MACHINE_NAME" --name "$WORKDIR" --hostpath "$VOL_DIR" --transient

最后,再次 ssh 进入 docker-machine 并挂载我们刚刚共享的文件夹:

docker-machine ssh $MACHINE_NAME "sudo mount -t vboxsf -o uid=\"$U\",gid=\"$G\" \"$WORKDIR\" \"$VOL_DIR\""

注意:对于 UID 和 GID,您基本上可以使用任何整数,只要它们尚未被占用。

这是在 OS X El Capitan 上从 docker-machine 0.4.1 和 docker 1.8.3 开始测试的。

【讨论】:

  • +1。经过几个小时的敲打我的头,你的答案奏效了。这应该是docker-machine 文档的一部分。
  • 为什么不使用-v 标志?
  • @igracia -v 标志不像您在 OS X(或 Windows)中所期望的那样工作。 Docker 在 VM 中运行,因此-v 中引用的文件夹指向 VM 中的文件夹,而不是根操作系统中的文件夹。此技术将 VM 文件夹映射回根操作系统的下一步。
  • @PatrickGunderson 在我的情况下(OS X),文件夹在主机中,而不是在虚拟机中,它工作正常。 Docker Tolls 负责将其导出到 VM,然后从那里导出到容器。
  • 我提到的规则的一个例外是,VM 将自动挂载/Users 以共享到 docker。这意味着如果您的工作文件位于 ~/* 中,那么您就可以开始了。如果你的开发环境设置用完了/development/Users 以外的任何东西,你就会遇到问题docs.docker.com/engine/userguide/containers/dockervolumes
【解决方案8】:
docker run -v /host/directory:/container/directory -t IMAGE-NAME /bin/bash

docker run -v /root/shareData:/home/shareData -t kylemanna/openvpn /bin/bash

在我的系统中,我已经更正了 nhjk 的答案,当您添加 -t 标志时,它可以完美运行。

【讨论】:

  • 您是否能够从本地 FS 创建/更新文件并查看 docker 容器内的更改?
【解决方案9】:

在 Mac OS 上,将文件夹 /Users/<name>/projects/ 挂载到您的容器根目录的 Mac 上:

docker run -it -v /Users/<name>/projects/:/projects <container_name> bash

ls /projects

【讨论】:

    【解决方案10】:

    使用command-line

    docker run -it --name <WHATEVER> -p <LOCAL_PORT>:<CONTAINER_PORT> -v <LOCAL_PATH>:<CONTAINER_PATH> -d <IMAGE>:<TAG>
    

    使用docker-compose.yaml

    version: '2'
      services:
        cms:
           image: <IMAGE>:<TAG>
           ports:
           - <LOCAL_PORT>:<CONTAINER_PORT>
           volumes:
           - <LOCAL_PATH>:<CONTAINER_PATH>
    

    假设:

    • 图像:k3_s3
    • 标签:最新
    • LOCAL_PORT:8080
    • CONTAINER_PORT:8080
    • LOCAL_PATH: /volume-to-mount
    • CONTAINER_PATH: /mnt

    例子:

    1. 首先创建 /volume-to-mount。 (如果存在则跳过)
    $ mkdir -p /volume-to-mount
    
    1. docker-compose -f docker-compose.yaml up -d
    version: '2'
      services:
        cms:
           image: ghost-cms:latest
           ports:
           - 8080:8080
           volumes:
           - /volume-to-mount:/mnt
    
    1. 验证您的容器:
    docker exec -it CONTAINER_ID ls -la /mnt
    

    【讨论】:

      【解决方案11】:

      如果主机是 Windows 10,那么不要使用正斜杠,而是使用反斜杠 -

      docker run -it -p 12001:80 -v c:\Users\C\Desktop\dockerStorage:/root/sketches
      

      确保主驱动器是共享的(在本例中为 C)。就我而言,在运行上述命令后,我收到了询问共享权限的提示。

      【讨论】:

        【解决方案12】:

        对于那些想在当前目录中挂载文件夹的人:

        docker run -d --name some-container -v ${PWD}/folder:/var/folder ubuntu
        

        【讨论】:

          【解决方案13】:

          对于 Windows 10 用户,将挂载点放在 C:/Users/ 目录内很重要。我尝试了几个小时来让它工作。这篇文章有所帮助,但起初并不明显,因为 Windows 10 的解决方案是对已接受答案的评论。我就是这样做的:

          docker run -it -p 12001:80 -v //c/Users/C/Desktop/dockerStorage:/root/sketches \
          <your-image-here> /bin/bash
          

          然后测试它,你可以在你的图像中做echo TEST &gt; hostTest.txt。您应该能够在C:/Users/C/Desktop/dockerStorage/ 的本地主机文件夹中看到这个新文件。

          【讨论】:

          • 路径上的双斜线使它对我有用。这很令人困惑,因为我首先使用了 -v $(pwd):/var/xx 并且确实有效,但导致了一个空目录。我正在通过 babun 运行 cyg。
          • 在 Windows 7 中使用 /c/data/ 时遇到同样的问题,将主机目录移动到 /c/Users// 下为我解决了这个问题。谢谢。
          • 我们可以提供帮助您解决问题的帖子的链接吗?
          【解决方案14】:

          2015 年 7 月更新 - boot2docker 现在支持直接挂载。您可以直接在 Mac 提示符下使用-v /var/logs/on/host:/var/logs/in/container,无需双重挂载

          【讨论】:

            【解决方案15】:

            从 Docker 18-CE 开始,您可以使用 docker run -v /src/path:/container/path 对主机文件夹进行双向绑定。

            如果您使用的是 Windows 10/WSL,并且将 Docker-CE for Windows 作为您的主机,然后在 WSL 中使用 docker-ce 客户端工具,那么这里有一个主要问题。 WSL 知道整个 / 文件系统,而您的 Windows 主机只知道您的驱动器。在 WSL 中,你可以使用 /mnt/c/projectpath,但是如果你尝试docker run -v ${PWD}:/projectpath,你会发现在主机上 /projectpath/ 是空的,因为在主机上 /mnt 没有任何意义。

            如果您从 /c/projectpath 工作,然后执行 docker run -v ${PWD}:/projectpath,您会发现在容器中,/projectpath 将实时反映 /c/projectpath。没有错误或任何其他方法可以检测到此问题,除了在您的客人中看到空安装。

            您还必须确保在 Docker for Windows 设置中“共享驱动器”。

            【讨论】:

            • 我在使用 Win10/WSL 和 Docker-CE/docker-ce 时遇到了这个问题。空 /projectpath/。 “从 /c/projectpath 工作”是什么意思?我尝试将 /c/ 链接到 /mnt/c 并从 /c/projectpath 运行,但随后出现错误 bind mount source path does not exist: /host_mnt/c/projectpath
            • 这个链接解决了我的问题:support.divio.com/local-development/docker/…(Windows 上的 Docker 默认只允许从 /Users/ 挂载)
            【解决方案16】:

            我也遇到了同样的问题。 我的命令行如下所示:

            docker run --rm -i --name $NAME -v `pwd`:/sources:z $NAME
            

            问题出在“密码”上。所以我把它改成了 $(pwd):

            docker run --rm -i --name $NAME -v $(pwd):/sources:z $NAME
            

            【讨论】:

            • z 是干什么用的?
            • z 选项表示绑定挂载内容在多个容器之间共享。
            【解决方案17】:

            如何将 main_folder 链接到 docker 容器内的 test_container 文件夹?

            您的以下命令是正确的,除非您在 Mac 上使用 boot2docker(取决于将来的更新),在这种情况下您可能会发现文件夹为空。有关更正此问题的教程,请参阅 mattes answer。

            docker run -d -v /Users/kishore/main_folder:/test_container k3_s3:latest
            

            我需要让它自动运行,如何在没有真正的情况下做到这一点 使用 run -d -v 命令。

            您无法真正摆脱使用这些命令,它们是 docker 工作方式所固有的。您最好将它们放入 shell 脚本中,以免重复写出它们。

            如果 boot2docker 崩溃了怎么办? docker 文件存储在哪里?

            如果您设法使用 -v 参数并引用您的主机,那么文件在您的主机上将是安全的。

            如果您使用过 'docker build -t myimage.'使用 Dockerfile,您的文件将被烘焙到映像中。

            我相信您的 docker 映像存储在 boot2docker-vm 中。当我从 VirtualBox 中删除 vm 时,我的图像消失了,我发现了这一点。 (注意,我不知道 Virtualbox 是如何工作的,所以图像可能仍然隐藏在其他地方,只是对 docker 不可见)。

            【讨论】:

              【解决方案18】:

              遇到了同样的问题。在docker documentation 找到这个:

              注意:主机目录本质上是依赖于主机的。出于这个原因,你不能从 Dockerfile 挂载主机目录,VOLUME 指令不支持传递主机目录,因为构建的图像应该是可移植的。主机目录不会在所有潜在主机上都可用。

              因此,只能使用docker run 命令中的-v 参数安装读/写主机目录,正如其他答案正确指出的那样。

              【讨论】:

              • 主机目录到底是什么?
              • @NicolasS.Xu 实际 docker 主机上的任何路径。
              • “这个功能并不总是有用的,所以让我们让它永远有用,以保持一致性”?
              【解决方案19】:

              我发现任何位于系统指令下的目录,如/var/usr/etc,都无法挂载到容器下。

              该指令应该在用户空间-v开关指示docker守护进程将本地目录挂载到容器,例如:

              docker run -t -d -v /{local}/{path}:/{container}/{path} --name {container_name} {imagename}
              

              【讨论】:

                【解决方案20】:

                这是一个带有 Windows 路径的示例:

                docker run -P -it --name organizr --mount src="/c/Users/MyUserName/AppData/Roaming/DockerConfigs/Organizr",dst=/config,type=bind organizrtools/organizr-v2:latest
                

                作为旁注,在所有这些拉扯头发的过程中,我不得不一遍又一遍地弄清楚路径并重新输入路径,我决定编写一个小的 AutoHotkey 脚本来将 Windows 路径转换为"Docker Windows" 格式化路径。这样,我所要做的就是将我想用作挂载点的任何 Windows 路径复制到剪贴板,按键盘上的“应用程序键”,它会将其格式化为 Docker 欣赏的路径格式。

                例如:

                将此复制到剪贴板:

                C:\Users\My PC\AppData\Roaming\DockerConfigs\Organizr

                在光标位于命令行上您想要的位置时按Apps Key,它会将其粘贴到那里:

                "/c/Users/My PC/AppData/Roaming/DockerConfigs/Organizr"

                为我节省了很多时间。这里是为其他可能觉得有用的人准备的。

                ; --------------------------------------------------------------------------------------------------------------
                ;
                ; Docker Utility: Convert a Windows Formatted Path to a Docker Formatter Path
                ;                   Useful for (example) when mounting Windows volumes via the command-line.
                ;
                ; By:       J. Scott Elblein
                ; Version:  1.0
                ; Date:     2/5/2019
                ;
                ; Usage:    Cut or Copy the Windows formatted path to the clipboard, press the AppsKey on your keyboard
                ;           (usually right next to the Windows Key), it'll format it into a 'docker path' and enter it
                ;           into the active window. Easy example usage would be to copy your intended volume path via
                ;           Explorer, place the cursor after the "-v" in your Docker command, press the Apps Key and
                ;           then it'll place the formatted path onto the line for you.
                ;
                ; TODO::    I may or may not add anything to this depending on needs. Some ideas are:
                ;           
                ;           - Add a tray menu with the ability to do some things, like just replace the unformatted path
                ;               on the clipboard with the formatted one rather than enter it automatically.
                ;           - Add 'smarter' handling so the it first confirms that the clipboard text is even a path in
                ;               the first place. (would need to be able to handle Win + Mac + Linux)
                ;           - Add command-line handling so the script doesn't need to always be in the tray, you could
                ;               just pass the Windows path to the script, have it format it, then paste and close.
                ;               Also, could have it just check for a path on the clipboard upon script startup, if found
                ;               do it's job, then exit the script.
                ;           - Add an 'all-in-one' action, to copy the selected Windows path, and then output the result.
                ;           - Whatever else comes to mind.
                ;
                ; --------------------------------------------------------------------------------------------------------------
                
                #NoEnv
                SendMode Input
                SetWorkingDir %A_ScriptDir%
                
                AppsKey::
                
                    ; Create a new var, store the current clipboard contents (should be a Windows path)
                    NewStr := Clipboard
                
                    ; Rip out the first 2 chars (should be a drive letter and colon) & convert the letter to lowercase
                    ; NOTE: I could probably replace the following 3 lines with a regexreplace, but atm I'm lazy and in a rush.
                    tmpVar := SubStr(NewStr, 1, 2)
                    StringLower, tmpVar, tmpVar
                
                    ; Replace the uppercase drive letter and colon with the lowercase drive letter and colon
                    NewStr := StrReplace(NewStr, SubStr(NewStr, 1, 2), tmpVar)
                
                    ; Replace backslashes with forward slashes
                    NewStr := StrReplace(NewStr,  "\", "/")
                
                    ; Replace all colons with nothing
                    NewStr := StrReplace(NewStr, ":", "")
                
                    ; Remove the last char if it's a trailing forward slash
                    NewStr :=  RegExReplace(NewStr, "/$")
                
                    ; Append a leading forward slash if not already there
                    if RegExMatch(NewStr, "^/") == 0
                        NewStr :=  "/" . NewStr
                
                    ; If there are any spaces in the path ... wrap in double quotes
                    if RegExMatch(NewStr, " ") > 0
                        NewStr :=  """" . NewStr . """"
                
                    ; Send the result to the active window
                    SendInput % NewStr 
                

                【讨论】:

                  【解决方案21】:

                  要使其在 Windows 10 中运行,我必须从系统托盘打开 Docker 设置窗口并转到 共享驱动器 部分。

                  然后我选中了C 旁边的框。 Docker 要求我提供桌面凭据以获得写入用户文件夹的授权。

                  然后我按照上面的示例以及该设置页面上的示例运行 docker 容器,并附加到容器中的 /data

                  docker run -v c:/Users/<user.name>/Desktop/dockerStorage:/data -other -options
                  

                  【讨论】:

                    【解决方案22】:

                    boot2docker 和 VirtualBox Guest Additions
                    如何将 /Users 挂载到 boot2docker

                    https://medium.com/boot2docker-lightweight-linux-for-docker/boot2docker-together-with-virtualbox-guest-additions-da1e3ab2465c

                    tl;dr 使用 VirtualBox Guest 构建您自己的自定义 boot2docker.iso 添加(见link)或下载 http://static.dockerfiles.io/boot2docker-v1.0.1-virtualbox-guest-additions-v4.3.12.iso 并将其保存到 ~/.boot2docker/boot2docker.iso。

                    【讨论】:

                    • 我尝试使用那个 iso,但我仍然遇到了同样的问题......虽然使用该帖子中概述的说明帮助我解决了问题 - 我基本上不得不强制共享文件夹。跨度>
                    • 我使用了iso,它偶然发现在调用'VBoxManage sharedfolder add ...' cmd之前我没有停止Virtual Box VM。尽管非常感谢,但终于让一切正常了。
                    • 注意:-v arg 不能通过 boot2docker 工作的原因显然与它安装到 boot2docker-vm 而不是您的实际主机有关。这就是为什么我猜 Vboxmanage 部分可以帮助它工作的原因。
                    【解决方案23】:

                    请注意,在 Windows 中,您必须提供绝对路径。

                    下面对我有用。

                    docker run -t -i -v D:/projects/:/home/chankeypathak/work -p 8888:8888 jupyter/tensorflow-notebook /bin/bash
                    

                    【讨论】:

                      【解决方案24】:

                      我有同样的问题,我试图在 docker 上挂载 C:\Users\ 文件夹
                      我就是这样做的 Docker Toolbox 命令行

                       $ docker run -it --name <containername> -v /c/Users:/myVolData <imagename>
                      

                      【讨论】:

                        【解决方案25】:

                        我有从容器挂载主机目录的相同要求,我使用了卷挂载命令。但是在测试过程中注意到它也在容器内创建文件但是经过一些挖掘发现它们只是符号链接和实际使用的文件系统来自主机。

                        【讨论】:

                          【解决方案26】:

                          您也可以使用 Portainer 网络应用程序来实现这一点,以获得不同的视觉体验。

                          先拉取Portainer镜像:

                          docker pull portainer/portainer
                          

                          然后为 Portainer 创建一个卷:

                          docker volume create portainer_data
                          

                          同时创建一个 Portainer 容器:

                          docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
                          

                          您将能够使用浏览器通过以下 URL 访问网络应用程序:“http://localhost:9000”。首次登录时,系统会提示您设置 Portainer 管理员凭据。

                          在 Web 应用程序中,按照以下菜单和按钮操作:(容器 > 添加容器 > 填充设置 > 部署容器)

                          我在使用 Portainer 创建“挂载”卷时遇到了麻烦,我意识到在创建容器卷时我必须单击“绑定”。下面是卷绑定设置的图示,该设置适用于我的容器创建,其中已安装卷绑定到主机。

                          P.S.:我使用的是 Docker 19.035 和 Portainer 1.23.1

                          【讨论】:

                            猜你喜欢
                            • 2022-11-03
                            • 1970-01-01
                            • 1970-01-01
                            • 2019-07-08
                            • 1970-01-01
                            • 1970-01-01
                            • 2017-12-27
                            • 2016-11-10
                            • 2017-02-23
                            相关资源
                            最近更新 更多