我有 Docker 容器,其命名卷在非 root 用户上运行,使用以下命令启动:
docker run -v backup:/backup someimage
Run Code Online (Sandbox Code Playgroud)
在图像中,有一个备份脚本尝试将文件保存在/backup
目录中,但失败了。目录中安装的backup
卷/backup
属于 root 用户。
如何更改/backup
目录的权限?
-----编辑1:
mcve如下:
使用 Gerrit 运行 docker 容器:
docker run -v backupgerrit:/backup --name gerrit gerritcodereview/gerrit
Run Code Online (Sandbox Code Playgroud)
现在在其他终端窗口上尝试在目录中保存一些内容/backup
:
docker exec gerrit touch /backup/testfile
Run Code Online (Sandbox Code Playgroud)
你会得到:
touch: cannot touch '/backup/testfile': Permission denied
Run Code Online (Sandbox Code Playgroud)
BMi*_*tch 31
命名卷在首次创建时会初始化为安装位置处的映像内容。该初始化包括所有者和权限。如果/backup
您的映像中不存在,则会创建一个空目录并由 root 拥有。你可以:
选项 1:在 Dockerfile 中创建具有适当所有权和权限的目录:
FROM your-image
USER root
RUN mkdir -p /backup \
&& chown -R your-user /backup
USER your-user
Run Code Online (Sandbox Code Playgroud)
请注意,这仅在备份命名卷尚不存在或为空时才有效。它必须是命名卷,而不是主机卷。
选项 2:使用另一个临时容器初始化命名卷,包括卷内的一些内容(空文件即可):
docker run --rm -v backupgerrit:/backup busybox \
/bin/sh -c 'touch /backup/.initialized && chown -R 1000:1000 /backup'
Run Code Online (Sandbox Code Playgroud)
选项 3:安装卷后调整权限,需要容器内的 root 权限:
docker exec -u 0:0 your-container chown -R your-user /backup
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
58168 次 |
最近记录: |