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

Rob*_*anu 6 docker

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

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

工作流程是:

  • 使用 /data 挂载 rw 启动容器 A
  • 使用 /data 安装的 ro 和更新版本的应用程序启动容器 B
  • 停止向容器 A 提供请求
  • 对于容器 A,将 /data 挂载设为只读
  • 对于容器 B,将 /data 挂载设为读写
  • 开始向容器 B 提供请求

zep*_*lin 5

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

mount -o remount,rw /mnt/data
Run Code Online (Sandbox Code Playgroud)

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

docker run --privileged ...
Run Code Online (Sandbox Code Playgroud)

或启用SYS_ADMIN功能

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

docker run --cap-add=SYS_ADMIN --security-opt apparmor:unconfined
Run Code Online (Sandbox Code Playgroud)

(请注意,我还必须添加 --security-opt apparmor:unconfined,以使其在 Ubuntu 上工作)。

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

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