主机操作系统:Debian 11 Bullseye
Docker 版本:5:24.0.2-1~debian.11~bullseye
容器操作系统:Debian 10 Buster
语境
我正在尝试容器化一个应用程序,我需要在容器重新启动时保持状态。
它将所有动态数据保存在/var/lib/
.
因此,最简单的解决方案应该是使用 docker 卷覆盖该目录。
在标准 Docker 操作下,这不是问题,但是,由于潜在的容器泄露和容器逃逸漏洞的安全问题,我们宁愿 Docker 守护进程和容器应用程序都在非 root 用户下运行。
问题
由于容器内的应用程序也应该以非特权用户身份运行,因此我无法以应用程序用户能够写入的方式挂载卷 -
期间设置文件夹的所有者构建阶段毫无意义,因为它仅在图像运行时被安装覆盖。
并且权限之后就不能更改了容器启动因为它已经在非特权用户的上下文中运行,并且挂载点由 root:root 所有
问题
我的问题很简单——有没有办法为非特权用户实现容器内的 RW 卷挂载?
答案1
对于任何也在寻找实现这一目标的方法的人来说,我最终到达了那里,但是方法并不明显。
其要点是:
- 以 root 身份运行映像
- 将入口点设置为脚本,您可以在其中:
- 首先递归 chown 卷挂载点
- 将执行移交给主要预期流程,并在流程中更改您的用户。
我使用 管理了第二点,因为使用我无法根据需要工作的gosu
库存。su
入口点脚本的完整示例:
#!/bin/sh
chown -R myAppUser: /var/lib/myAppData
exec gosu myAppUser /usr/local/bin/myApp --foo=bar
最终结果:myApp
在 下运行myAppUser
,同时对外部挂载卷 具有完全的读写访问权限/var/lib/myAppData
,即使在无根 Docker 实例中也是如此。