将文件从容器fs复制到同级容器

时间:2019-05-10 21:04:19

标签: docker docker-run

假设我在以以下内容开头的容器中运行:

docker run -v /var/run/docker.sock:/var/run/docker.sock foo

然后我从上面的容器中启动另一个容器:

docker run -v /var/run/docker.sock:/var/run/docker.sock bar

我的问题是-第二个命令中的/var/run/docker.sock是否指向与第一个命令相同的/var/run/docker.sock?

容器应该是兄弟姐妹,所以我的第二个问题是-如何使用-v选项将文件从“外部”容器放入“内部”容器?我正在寻找:

docker run -v "/foo:/bar" -v /var/run/docker.sock:/var/run/docker.sock bar

1 个答案:

答案 0 :(得分:1)

当一个人将Docker套接字安装到容器中时,他/她就可以控制在主机上运行 的Docker实例的容器。

您可以认为这类似于为多个容器提供网站的URL。任何类似的容器确实会影响类似的网站,这些更改对所有人都是可见的。

具体来说,在此设置下,容器没有层次结构:只有多个容器可以控制同一docker守护程序,否则它们可以通过主机上的docker命令进行控制。每个容器都具有通过docker守护程序在主机上执行几乎所有操作的同等能力,默认情况下,容器提供的隔离几乎将被完全颠覆。

由于这个原因, docker中的docker 具有一些内在的安全隐患,但是在Internet上的其他地方可以找到更多这些隐患。

要回答您的第二个问题,请在容器之间复制文件,这涉及到运行一个发出源容器中文件内容的命令,并将其通过管道传递给一个写入目标容器中目标文件的命令。例如:

docker exec container1 cat /source/file | docker exec -i container2 bash -c "cat > /dest/file"

复制多个文件可能需要在源文件中创建一个tarball,在另一个文件中将其扩展:

docker exec container1 tar -C /source -c dir| docker exec -i container2 tar -C /dest -x

为方便起见,在容器中没有外壳或tar的情况下,可以使用docker cp将文件从容器复制到主机。通过将文件从源容器复制到主机,然后再复制到目标容器,您可以得到相同的解决方案,但需要花费一些临时存储空间。例如:

docker cp container1:/source/file file
docker cp file container2:/dest/file

不过,你在做某事。一种替代方法是将主机中的目录装入两个容器中,并通过该目录进行通信。例如:

mkdir shared
docker run -d --name=container1 -v $PWD/shared:/mnt/share image command
docker run -d --name=container2 -v $PWD/shared:/mnt/share image command

尽管有错别字,但上面的示例将导致两个容器可用。这两个容器中的进程可以通过/mnt/share共享文件,并由主机上的shared/目录支持。