是否有可能在运行时更改docker mount的只读/读写状态?

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

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

工作stream程将是:

  • 启动容器A,并将数据安装到rw
  • 启动容器B,并挂载/数据ro,以及更新版本的应用程序
  • 停止向容器A提供请求
  • 对于容器A,使/ data mount只读
  • 对于容器B,使/ data mount可读写
  • 开始向容器B提供服务请求

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

 mount -o remount,rw /mnt/data 

问题在于默认情况下Docker容器内部不允许装入系统调用,因此您必须以特权模式运行它:

 docker run --privileged ... 

或启用SYS_ADMINfunction

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

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

(注意,我还必须添加–security-opt apparmor:unconfined,才能在Ubuntu上运行)。

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

但我的猜测是,你可以重新启动容器,而不是运行旧版本的应用程序。