我可以将docker主机目录挂载为写入/覆盖上的副本吗?

我想在Docker中挂载一个主机目录,而在外面实际上是只读的。 但我希望它出现在容器内读/写。

这样我可以写入文件/目录,但不能在外面改变。 这可能使用某种叠加过程吗?

这就是我所做的:

在主机上:

加载目录为只读。

docker run --privileged -v /path/on/host:/path/on/client-read-only:ro -it ubuntu /bin/bash

在客户端:

在客户端上使用OverlayFS通过从主机挂载的只读目录。

mount -t overlayfs none -o lowerdir=/path/on/client-read-only,upperdir=/path/on/client /path/on/client

然后使用/path/on/client读取/写入文件。

编辑 :如果你的主机上有一个3.18+内核,你可能更喜欢在客户端上使用它:

mount -t overlay overlay -o lowerdir=/path/on/client-read-only,upperdir=/path/on/client,workdir=/path/on/client-workdir /path/on/client

哪个不是overlayfs 。 用overlayfs我有一个关于无法使用rmoverlay为我解决了这个问题。

我会build议看看你的文件系统是否支持overlayfs; 并可以通过validation

  $> cat /proc/filesystems | grep overlayfs $> overlayfs overlay 

如果是这样,那么我build议你在主机上创buildoverlayfs,并将合并目录挂载到Docker容器,这样你就可以pipe理主机上的东西,而不是主机上的一些东西,还有一些在Docker容器上。

我遵循以下步骤来实现这一点:让我举个例子; 我有源代码,我想build立多个平台,如i386,x86_64和amd64 ; 所有平台的源代码将保持不变; 作为每个平台的可执行文件(.obj和exe)将有所不同; 所以我们需要在每个特定的平台目录下执行

  sudo mount -t overlay overlay -o lowerdir=/home/viswesn/source-code,upperdir=/home/viswesn/i386_executable,workdir=/i386 /home/viswesn/i386_merged sudo mount -t overlay overlay -o lowerdir=/home/viswesn/source-code,upperdir=/home/viswesn/x86_64_executable,workdir=/x86_64 /home/viswesn/x86_64_merged 

它说,任何由源文件创build的目标文件或可执行文件将保留在/ home / viswesn / X_executable目录中,源代码将保留在/ home / viswesn / source-code中; as / home / viswesn / X_merged /将包含特定平台的源代码和可执行文件;

现在,我们应该将X_merged目录作为卷挂载到Docker容器中,以构build每个平台的源代码

对于i386:

  sudo docker run --privileged -v /home/viswesn/i386_merged/:/source-code -it ubuntu-trusty:14:01 /bin/bash 

对于amd64:

 sudo docker run --privileged -v /home/viswesn/amd64_merged/:/source-code -it ubuntu-amd64:14:01 /bin/bash 

有了这个,同一个源代码就可以同时为所有平台同时构build,而不需要源代码的多个副本。