是否可以在运行时更改docker挂载的只读/读写状态?

时间:2017-03-30 12:33:23

标签: docker

我有一个dockerized应用程序,它使用文件系统来存储大量状态。应用程序代码包含在docker镜像

我正在考虑更新策略,该策略涉及在两个容器之间共享卷,但确保一次最多一个容器可以写入该文件系统。

工作流程将是:

  • 使用/ data mounted rw
  • 启动容器A.
  • 使用/ data mounted ro启动容器B,以及更新版本的应用程序
  • 停止向容器A提出请求
  • 对于容器A,使/ data mount为只读
  • 对于容器B,使/ data mount read-write
  • 开始向容器B提出请求

1 个答案:

答案 0 :(得分:3)

您可以在rw模式下从容器内重新装入卷,如下所示:

mount -o remount,rw /mnt/data

问题是默认情况下不允许在Docker容器中挂载syscall,因此您必须以特权模式运行它:

docker run --privileged ...

或启用SYS_ADMIN功能

  

SYS_ADMIN执行一系列系统管理操作。

docker run --cap-add=SYS_ADMIN --security-opt apparmor:unconfined

(请注意,我还必须添加--security-opt apparmor:unconfined,以便在Ubuntu上运行)。

此外,将rw卷重新安装回ro可能会非常棘手,因为某些进程可能已经在其中打开了一些文件进行写入,在这种情况下remount将失败并显示is busy错误消息。

但我的猜测是你可以重新启动容器(因为它将运行旧版本的应用程序)。