以读写权限挂载数据卷到 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
管理容器的任何人。
我一直在尝试解决 limactl
和 lima 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
我想将主机数据卷挂载到 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
管理容器的任何人。
我一直在尝试解决 limactl
和 lima 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