2016-02-22 84 views
0

我知道你可以使用VOLUMES指令与一个容器共享一个存在于主机上的目录,但是我想做相反的事情 - 与主机共享容器中存在的文件,前提是没有任何东西存在主机上的那个目录。在Docker中,我如何将容器从容器共享到主机?

对此的用例是我们有承包商,我们想为他们提供一个码头容器,它包含他们需要使用的所有代码和基础设施,但是这将允许他们通过改变代码在本地机器上运行PyCharm或其他程序,而不必担心提交容器,等等。

+1

这不是SCC的用途吗?无论如何,容器中的每个目录都驻留在某个主机上。做一个码头检查,看看哪里...... – user2105103

+0

SCC代表什么? –

+0

源代码管理。 git/cvs等 – user2105103

回答

0

在你的Dockerfile你可以很容易地ADD or COPY整个目录。

我想这就是你要找的。否则,您可以共享代码并在docker run处,以便它们可以批量安装共享代码。

+0

这允许我将数据复制到图像中,当然,但为了访问它,我的承包商必须猛击容器。此外,他们不能轻易地在没有提交码头集装箱的情况下进行更改,这是我在问题中提到的,我不希望他们做的事情。 –

+0

我同意了,因此我的最后一句话是:“否则,您可以将代码分享到图像旁边,在码头运行时,他们可以批量安装共享代码。”所以代码可以在不提交的情况下进行修改。代码实际上不应该在图像中,这是一个不好的做法(因为那时需要提交操作)。 – Auzias

2

为了能够保存(保留)数据,Docker提出了卷的概念。基本上Volumes是在默认的联盟文件系统之外的目录(或文件),并且存在为主机文件系统上的普通目录和文件。

你可以声明在运行时与-v标志的卷:

$ docker run -it --name container1 -v /data debian /bin/bash 

这会使容器内的目录/data住联盟的文件系统之外,并在主机上直接访问。 /data目录中的任何文件都将被复制到卷中。我们可以通过在主机上使用docker inspect命令来找出卷在主机上的位置。

打开一个新的终端并保留以前的容器中运行,运行:

$ docker inspect container1 

输出将提供在容器配置,其中包括卷的详细信息。 输出应类似于下面的内容:即泊坞窗已在主机安装/data容器内的某个目录里/var/lib/docker

... 
Mounts": [ 
    { 
     "Name": "fac362...80535", 
     "Source": "//var/lib/docker/vfs/dir/cde167197ccc3e/_data", 
     "Destination": "/data", 
     "Driver": "local", 
     "Mode": "", 
     "RW": true, 
     "Propagation": "" 
    } 
] 
... 

告诉我们。

+0

谢谢你的一个很好的答案,谢谢,但据我了解,如果每个引用该卷的容器都被删除,那么该卷也会被删除。如果可能的话,我希望数据能够坚持下去。 –

+0

根据我的理解,卷被设计为保持数据,与容器的生命周期无关。即使容器本身被删除,数据卷仍然存在。 –

+0

我正在从此问题中删除已接受的答案标志,因为该解决方案仅适用于Linux。在Windows和OSX上,docker-machine使用VirtualBox,它不暴露卷所在的目录。 我们已经回到原点了。承包商无法访问容器中的卷。 –

相关问题