Docker挂载卷。权限被拒绝。

10

我在挂载的Docker卷中创建新文件时遇到了问题。

首先,在安装Docker后,我将我的用户添加到docker组。

sudo usermod -aG docker $USER

创建为我的 $USER 文件夹:

mkdir -p /srv/redis

开始容器:

docker run -d -v /srv/redis:/data --name myredis redis
当我想以创建容器的用户身份在 /srv/redis 中创建文件时,我遇到了访问问题。
mkdir /srv/redis/redisTest
mkdir: cannot create directory ‘/srv/redis/redisTest’: Permission denied

我尝试在其他帖子中搜索,但没有找到合适的解决方案。


你正在尝试运行 mkdir redisTest 的用户是谁?它属于哪些组? - DevDio
创建了 Redis 容器的用户,该容器位于 Docker 组 @DevDio。我编辑了 mkdir 路径。 - moviss
3个回答

12

在我看来,问题标题并未反映实际问题。

mkdir /srv/redis/redisTest
mkdir: cannot create directory ‘/srv/redis/redisTest’: Permission denied

这个问题很可能是因为在运行时:

docker run -d -v /srv/redis:/data --name myredis redis

目录 /srv/redis 的所有权更改为 root。您可以通过以下方式进行检查

ls -lah /srv/redis
< p >将外部目录安装到< code >docker< /code >的正常后果。要恢复访问权限,您必须运行< /p >
sudo chown -R $USER /srv/redis

1
看起来 chown 能用,但是将其应用于 Redis 容器保存文件的目录安全吗? - moviss
@moviss 回答你的问题。当你在卷上再次运行docker时,某些文件可能会被重新授权给root,或者其中的应用程序(例如redis)甚至可能因为所有权错误而失败。所以这是一个我没有完美答案的困境。但你可以研究一下我贡献的这个Github上的docker设置,你可以使用非root用户运行docker。它可能会给你一些想法:https://github.com/broadinstitute/viral-ngs-deploy/blob/master/docker。仔细查看Dockerfile和env_wrapper.sh,我在其中使用了`gosu`。 - biocyberman

2
这也可能与启用SELinux有关(我刚刚发现)。这个DevOps Stack Exchange上的答案对我很有用

解决方案是在[docker]运行卷参数的末尾添加:z,使得:

docker run -v /host/foobar:/src_dir /bin/bash

变成:

docker run -it -v /host/foobar:/src_dir:z /bin/bash


1
我认为/srv/redis/redisTest目录是由redis容器内的用户创建的,因此它属于redis容器用户。
您是否已经使用ls -l检查了/srv/redis/redisTest目录是否属于$USER

我想在容器外创建目录 :P - moviss
是的,但是当您以这种方式挂载时,/srv/redis/目录将由容器自动创建。就像@biocyberman所说的那样。很可能该目录属于Redis容器内的root用户,即使您手动创建了它。 - Fendi jatmiko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接