首页 文章

如何在Docker容器中安装主机目录

提问于
浏览
379

我正在尝试将主机目录挂载到Docker容器中,以便在主机上完成的任何更新都会反映到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版本

问题,面临的问题:

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

  • 我需要自动进行此操作 . 如何在不使用 run -d -v 命令的情况下执行此操作?

  • 如果boot2docker崩溃会怎么样? Docker文件存储在哪里(除了Dockerfile)?

19 回答

  • 4

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

    ADD . /path/inside/docker/container
    

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

    执行此操作的第二种方法是您尝试的方式,即装入卷 . 由于尝试尽可能便携,您无法将主机目录映射到dockerfile中的docker容器目录,因为主机目录可能会根据您运行的计算机而更改 . 要将主机目录映射到docker容器目录,在使用docker run时需要使用 -v 标志,如下所示:

    docker run -v /host/directory:/container/directory -other -options image_name command_to_run
    
  • 3

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

    您想要的是,在容器目录中保持本地目录同步,通过安装类型为 bind 的卷来完成 . 这将绑定源(您的系统)和目标(在docker容器)目录 . 它与在linux上安装目录几乎相同 .

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

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

    • mount的 type ,可以是 bindvolumetmpfs . (我们将使用 bind

    • 山的 source . 对于绑定装入,这是Docker守护程序主机上的文件或目录的路径 . 可以指定为 sourcesrc .

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

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

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

    如果这些mount参数有空格,则必须在它们周围加上引号 . 当我知道他们不这样做时,我会使用 pwd 代替:

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

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

  • 24

    2个连续的安装:我想这里的很多帖子可能都使用了两个boot2docker,你没有看到任何东西的原因是因为你从boot2docker安装了一个目录而不是你的主机 . 您基本上需要2个连续的安装:第一个是从主机到系统安装目录,第二个是将新目录从boot2docker安装到您的容器,如下所示:

    1.在boot2docker上挂载本地系统

    sudo mount -t vboxsf hostfolder /boot2dockerfolder
    

    linux容器上的

    2. mount boot2docker文件

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

    然后当你在容器文件夹中 ls 时,你会看到你的主机文件夹的内容

  • 110

    你可以使用cli中的-v选项,这个工具不能通过Dockerfile使用

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

    其中host_dir是要装入的主机的目录 . 你不需要担心容器的目录,如果它不存在,docker会创建它 .

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

  • 59

    是否有可能通过 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) .

  • 10

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

    所有当前的答案都在讨论Boot2docker . 由于现在已经弃用了docker-machine,这适用于docker-machine:

    首先,ssh进入docker-machine vm并创建我们将映射到的文件夹:

    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
    

    最后,再次进入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 .

  • 41

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

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

    cd my_source_code_folder
    docker run -it -p 1337:1337 -v $(pwd):/app my_docker/image_with_nodejs_etc
    
  • 4
    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 标志时它会完美无瑕 .

  • 1

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

  • 16

    我发现在系统指令下放置的任何目录如 /var/usr/etc 都无法安装在容器下 .

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

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

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

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

    tl; dr使用VirtualBox Guest Additions构建您自己的自定义boot2docker.iso(请参阅链接)或下载http://static.dockerfiles.io/boot2docker-v1.0.1-virtualbox-guest-additions-v4.3.12.iso并保存它到〜/ .boot2docker / boot2docker.iso .

  • 31

    How do I link the main_folder to the test_container folder present inside the docker container?

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

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

    I need to make this run automatically, how to do that without really using the run -d -v command.

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

    What happens if boot2docker crashes? Where are the docker files stored?

    如果您设法使用-v arg并引用主机,则文件在主机上是安全的 .

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

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

  • 25

    有同样的问题 . 在_613359中找到了这个:

    注意:主机目录本质上是依赖于主机的 . 因此,您无法从Dockerfile安装主机目录,VOLUME指令不支持传递host-dir,因为构建的映像应该是可移植的 . 主机目录在所有潜在主机上都不可用 .

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

  • 5

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

    如果您正在使用Windows 10 / WSL并将Docker-CE for Windows作为主机,然后使用docker-ce客户端工具在WSL中,那么这里有一个主要的问题 . 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设置中“共享驱动器” .

  • 0

    我一直有同样的问题 . 我的命令行看起来像这样:

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

    问题出在'pwd'上 . 所以我改为$(pwd):

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

    对于 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 > hostTest.txt . 您应该能够在 C:/Users/C/Desktop/dockerStorage/ 的本地主机文件夹中看到此新文件 .

  • 1

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

    以下对我有用 .

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

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

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

    我有同样的要求从容器挂载主机目录,我使用了volume mount命令 . 但在测试期间注意到它正在容器内创建文件但是经过一些挖掘后发现它们只是符号链接和实际文件系统用于主机 .

相关问题