我正在尝试将主机目录挂载到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 回答
有几种方法可以做到这一点 . 最简单的方法是使用dockerfile
ADD
命令,如下所示:但是,在构建dockerfile之后对主机上的此目录所做的任何更改都不会显示在容器中 . 这是因为在构建容器时,docker会将目录压缩为
.tar
,并将该上下文永久地上载到容器中 .执行此操作的第二种方法是您尝试的方式,即装入卷 . 由于尝试尽可能便携,您无法将主机目录映射到dockerfile中的docker容器目录,因为主机目录可能会根据您运行的计算机而更改 . 要将主机目录映射到docker容器目录,在使用docker run时需要使用
-v
标志,如下所示:这个问题的用户使用
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
,可以是bind
,volume
或tmpfs
. (我们将使用 bind )山的
source
. 对于绑定装入,这是Docker守护程序主机上的文件或目录的路径 . 可以指定为source
或src
.destination
将文件或目录将在容器中装入的路径作为其值 . 可以指定为destination
,dst
或target
.因此,要使用
/test_container
(目标)挂载当前目录(源),我们将使用:如果这些mount参数有空格,则必须在它们周围加上引号 . 当我知道他们不这样做时,我会使用
pwd
代替:您还必须处理文件权限,请参阅this article .
2个连续的安装:我想这里的很多帖子可能都使用了两个boot2docker,你没有看到任何东西的原因是因为你从boot2docker安装了一个目录而不是你的主机 . 您基本上需要2个连续的安装:第一个是从主机到系统安装目录,第二个是将新目录从boot2docker安装到您的容器,如下所示:
1.在boot2docker上挂载本地系统
linux容器上的
2. mount boot2docker文件
然后当你在容器文件夹中
ls
时,你会看到你的主机文件夹的内容你可以使用cli中的-v选项,这个工具不能通过Dockerfile使用
docker run -t -i -v <host_dir>:<container_dir> ubuntu /bin/bash
其中host_dir是要装入的主机的目录 . 你不需要担心容器的目录,如果它不存在,docker会创建它 .
如果您在host_dir中对主机进行任何更改(在root权限下),它将对容器可见,反之亦然 .
是否有可能通过
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) .
[UPDATE] 截至2017年6月,Docker for Mac负责处理您必须弄乱VirtualBox的所有烦人部分 . 它允许您使用
/private
前缀基本上映射本地主机上的所有内容 . 更多信息here . [/UPDATE]所有当前的答案都在讨论Boot2docker . 由于现在已经弃用了docker-machine,这适用于docker-machine:
首先,ssh进入docker-machine vm并创建我们将映射到的文件夹:
现在将文件夹共享到VirtualBox:
最后,再次进入docker-machine并挂载我们刚刚共享的文件夹:
注意:对于UID和GID,只要它们尚未被采用,您基本上可以使用任何整数 .
这是在OS X El Capitan上测试的docker-machine 0.4.1和docker 1.8.3 .
我只是尝试让我的SailsJS应用程序在Docker容器中运行,以保持我的物理机器清洁 .
我正在使用以下命令在/ app下挂载我的SailsJS / NodeJS应用程序:
在我的系统中,我已经纠正了nhjk的答案,当你添加
-t
标志时它会完美无瑕 .2015年7月更新 - boot2docker现在支持直接安装 . 您可以直接在Mac提示符下使用
-v /var/logs/on/host:/var/logs/in/container
,无需双重安装我发现在系统指令下放置的任何目录如
/var
,/usr
,/etc
都无法安装在容器下 .该指令应位于用户的空间
-v
开关指示docker守护程序将本地目录挂载到容器,例如:boot2docker together with VirtualBox Guest Additions
如何将/ Users挂载到boot2docker
https://medium.com/boot2docker-lightweight-linux-for-docker/boot2docker-together-with-virtualbox-guest-additions-da1e3ab2465c
How do I link the main_folder to the test_container folder present inside the docker container?
您的下面的命令是正确的,除非您在使用boot2docker的mac上(取决于将来的更新),在这种情况下,您可能会发现该文件夹为空 . 有关更正此问题的教程,请参阅mattes答案 .
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不可见) .
有同样的问题 . 在_613359中找到了这个:
因此,只有使用
docker run
命令中的-v
参数才能安装读/写主机目录,因为其他答案正确指出 .从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设置中“共享驱动器” .
我一直有同样的问题 . 我的命令行看起来像这样:
问题出在'pwd'上 . 所以我改为$(pwd):
对于 Windows 10 用户,将挂载点放在
C:/Users/
目录中非常重要 . 我试了几个小时才能让它发挥作用 . 这篇文章有所帮助,但最初并不明显,因为Windows 10的解决方案是对已接受答案的评论 . 这就是我做的方式:然后要测试它,你可以在你的图像中做
echo TEST > hostTest.txt
. 您应该能够在C:/Users/C/Desktop/dockerStorage/
的本地主机文件夹中看到此新文件 .请注意,在Windows中,您必须提供绝对路径 .
主机:Windows 10
容器:Tensorflow Notebook
以下对我有用 .
我有同样的问题,我试图在docker上挂载C:\ Users \文件夹
这就是我用它做Docker Toolbox命令行的方法
我有同样的要求从容器挂载主机目录,我使用了volume mount命令 . 但在测试期间注意到它正在容器内创建文件但是经过一些挖掘后发现它们只是符号链接和实际文件系统用于主机 .