更改 Docker 中命名卷的权限

Qki*_*kiZ 17 docker

我有 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)

  • 它的配置最少。不需要 Dockerfile,因为您可以使用 Docker Hub 中的映像。图像中不需要“备份”目录。如果您使用示例中的“docker run”命令,它将由 Docker 在容器启动时创建。 (2认同)