我使用以下命令启动了在非 root 用户上运行的命名卷的 Docker 容器:
docker run -v backup:/backup someimage
在图像中,有一个备份脚本试图将文件保存在/backup
目录中,但它失败了。dir 中挂载backup
的卷/backup
属于 root 用户。
如何更改/backup
目录的权限?
-----编辑1:
麦克维如下:
使用 Gerrit 运行 docker 容器:
docker run -v backupgerrit:/backup --name gerrit gerritcodereview/gerrit
现在在其他终端窗口尝试在/backup
目录中保存一些东西:
docker exec gerrit touch /backup/testfile
你会得到:
touch: cannot touch '/backup/testfile': Permission denied
命名卷在首次创建时初始化为安装位置的映像内容。该初始化包括所有者和权限。如果
/backup
您的映像中不存在,则将创建一个空目录并由 root 拥有。你可以:选项 1:在 Dockerfile 中创建具有适当所有权和权限的目录:
请注意,这仅在备份命名卷不存在或为空时有效。它必须是命名卷,而不是主机卷。
选项 2:使用另一个临时容器初始化命名卷,包括卷内的一些内容(空文件可以工作):
选项 3:安装卷后调整权限,需要容器内的 root:
工作解决方案在这里。默认设置下的 Docker 将卷数据保存在
/var/lib/docker/volumes/
.backupgerrit
基于命名卷的问题文件中的示例保留在/var/lib/docker/volumes/backupgerrit/_data
. 基本目录是_data
及其权限。在此示例中,Gerrit 容器使用 id 为 1000 的用户。解决方案是将此_data
目录的所有权设置为1000:1000
.这是从容器端看的样子:
_data
dir 的权限是持久的,直到删除卷