我知道你可以使用VOLUMES指令与一个容器共享一个存在于主机上的目录,但是我想做相反的事情 - 与主机共享容器中存在的文件,前提是没有任何东西存在主机上的那个目录。在Docker中,我如何将容器从容器共享到主机?
对此的用例是我们有承包商,我们想为他们提供一个码头容器,它包含他们需要使用的所有代码和基础设施,但是这将允许他们通过改变代码在本地机器上运行PyCharm或其他程序,而不必担心提交容器,等等。
我知道你可以使用VOLUMES指令与一个容器共享一个存在于主机上的目录,但是我想做相反的事情 - 与主机共享容器中存在的文件,前提是没有任何东西存在主机上的那个目录。在Docker中,我如何将容器从容器共享到主机?
对此的用例是我们有承包商,我们想为他们提供一个码头容器,它包含他们需要使用的所有代码和基础设施,但是这将允许他们通过改变代码在本地机器上运行PyCharm或其他程序,而不必担心提交容器,等等。
在你的Dockerfile你可以很容易地ADD
or COPY
整个目录。
我想这就是你要找的。否则,您可以共享代码并在docker run
处,以便它们可以批量安装共享代码。
这允许我将数据复制到图像中,当然,但为了访问它,我的承包商必须猛击容器。此外,他们不能轻易地在没有提交码头集装箱的情况下进行更改,这是我在问题中提到的,我不希望他们做的事情。 –
我同意了,因此我的最后一句话是:“否则,您可以将代码分享到图像旁边,在码头运行时,他们可以批量安装共享代码。”所以代码可以在不提交的情况下进行修改。代码实际上不应该在图像中,这是一个不好的做法(因为那时需要提交操作)。 – Auzias
为了能够保存(保留)数据,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": ""
}
]
...
告诉我们。
谢谢你的一个很好的答案,谢谢,但据我了解,如果每个引用该卷的容器都被删除,那么该卷也会被删除。如果可能的话,我希望数据能够坚持下去。 –
根据我的理解,卷被设计为保持数据,与容器的生命周期无关。即使容器本身被删除,数据卷仍然存在。 –
我正在从此问题中删除已接受的答案标志,因为该解决方案仅适用于Linux。在Windows和OSX上,docker-machine使用VirtualBox,它不暴露卷所在的目录。 我们已经回到原点了。承包商无法访问容器中的卷。 –
这不是SCC的用途吗?无论如何,容器中的每个目录都驻留在某个主机上。做一个码头检查,看看哪里...... – user2105103
SCC代表什么? –
源代码管理。 git/cvs等 – user2105103