以读写权限挂载数据卷到 docker

Mount data volume to docker with read&write permission

我想将主机数据卷挂载到 docker。但是容器应该对它有读写权限,同时数据卷的任何变化不应该影响主机中的数据。

我可以想象一个将多个数据卷装载到单个文件夹的解决方案,一个是只读的,另一个是读写的。但是只有这第二个'-v'在我的命令中起作用,

docker run -ti --name build_cent1 -v /codebase/:/code:ro -v /temp:/code:rw centos6:1.0 bash

only this second '-v' works in my command,

这可能是因为两个 -v 选项都试图将主机文件夹装载到 相同的 容器目标文件夹 /code

   -v /codebase/:/code:ro 
                 ^^^^^
   -v /temp:/code:rw
            ^^^^^   

您可以将这些主机文件夹装载到 /code 内的两个单独文件夹中。
如:

-v /codebase/:/code/base:ro -v /temp:/code/temp:rw.

通常在这种情况下,我认为你 ADD 文件夹到 Docker 图像,这样任何容器 运行 它都会在其(可写)文件系统中拥有它,但是写入将转到不同的层。

你需要在你想使用的文件夹上面写一个Dockerfile,看起来应该是这样的:

FROM my/image
ADD codebase /codebase

然后使用 docker build -t some-name <path> 构建容器。这些步骤可以添加到您应用程序的构建脚本中(也许您会找到一些插件来提供帮助)。那么你可以docker run some-name.

缺点是只有一个副本和镜像创建,但是如果你启动许多容器,它们将以只读方式共享同一层副本,并将它们自己的修改写入上面的独立层。

github 中得到了 nixun 的一个回答。

you can simply use overlayfs to fix this:

mount -t overlay overlay \
    -olowerdir=/codebase,upperdir=/temp,workdir=/workdir /codebase_new
docker run -ti --name build_cent1 -v /codebase_new:/code:rw centos6:1.0 bash

该方案具有很好的灵活性。使用共享文件夹创建图像是一种解决方案,但它无法轻松更新文件夹数据。

此答案不适用于 docker 用户,但它会帮助使用 Lima 管理容器的任何人。

我一直在尝试解决 limactllima nerdctl 的问题。我认为值得分享修复程序,这样它可以帮助社区中使用 lima 而不是 docker:

的任何人

默认情况下Lima 将卷安装为只读。要使它们默认可写,请执行以下操作:

编辑文件并在 mount 部分下设置 write: true

$ vim ~/.lima/default/lima.yaml

然后重启lima

limactl list #this lists all running vms 
limactl stop default #or name of the machine 
limactl start default #or name of the machine 

您仍然需要像 docker

一样指定挂载选项
    lima nerdctl run -ti --name build_cent1 \
    -v /codebase/:/code/base:ro \
    -v /temp:/code/temp:rw \
    centos6:1.0 bash

有关利马的更多信息,请查看this