为了缓解容器对其主机的 root 访问权限问题,我喜欢按照 docker 文档的建议,使用命名空间启动 docker 服务。我这样做了
sudo adduser dockremap
sudo sh -c 'echo dockremap:500000:65536 > /etc/subuid'
sudo sh -c 'echo dockremap:500000:65536 > /etc/subgid'
sudo vim /etc/docker/daemon.json
{
"userns-remap": "dockremap"
}
sudo service docker restart
虽然这导致了在映射到主机上的 dockremap 的容器内拥有 root 权限的期望行为,但我再也无法看到之前创建的所有图像和容器。
问题: 是否可以像所示那样重新启动 docker 守护进程,但保留我的所有卷、图像和容器?如果不能,还有什么建议吗(docker rootless、apparmore groups <- 很难找到开始)
答案1
不,不可能。来自Docker 关于用户命名空间的文档:
启用可
userns-remap
有效屏蔽现有镜像和容器层,以及 中的其他 Docker 对象/var/lib/docker/
。这是因为 Docker 需要调整这些资源的所有权,并实际将它们存储在 中的子目录中/var/lib/docker/
。最好在新的 Docker 安装上启用此功能,而不是在现有的 Docker 安装上。
Docker 希望简化这一过程,但在文件系统级别,文件的 uid/gid 无法以与文件系统无关的方式透明地映射。有人在努力添加此功能,其中最明显的进展是无根开发。值得关注的包括 shiftfs、fuse-overlayfs 和类似项目背后的努力。