我有一个使用文件系统存储大量状态的码头化应用程序.应用程序代码包含在docker映像中
我正在考虑一种更新策略,该策略涉及在两个容器之间共享卷,但要确保一次最多只有一个容器可以写入该文件系统.
工作流程为:
>使用/ data挂载rw启动容器A
>使用/ data挂载ro和应用程序的较新版本启动容器B
>停止向容器A提供请求
>对于容器A,将/ data挂载设为只读
>对于容器B,使/ data安装为可读写
>开始向容器B提供请求
最佳答案
您可以在rw模式下从容器内部重新安装卷,如下所示:
mount -o remount,rw /mnt/data
问题是,默认情况下,在Docker容器内不允许mount syscall,因此您必须在特权模式下运行它:
docker run --privileged ...
SYS_ADMIN Perform a range of system administration operations.
docker run --cap-add=SYS_ADMIN --security-opt apparmor:unconfined
(请注意,我还必须添加–security-opt apparmor:unconfined才能在Ubuntu上实现此功能).
另外,将rw卷重新安装到ro可能很棘手,因为某些进程可能已经打开了其中的一些文件进行写入,在这种情况下,重新加载将失败,并显示繁忙错误消息.
但是我的猜测是,您可以改为重新启动容器(因为它将运行旧版本的应用程序).