Docker:使用 --volume 绑定(bind)挂载的文件权限

标签 docker alpine

我遵循以下指南:https://denibertovic.com/posts/handling-permissions-with-docker-volumes/在我的容器中设置 --volume 绑定(bind)挂载并在 guest 容器中创建一个与我的主机用户具有相同 UID 的用户——理论上我的容器用户应该能够访问挂载。它对我不起作用,我正在寻找一些下一步尝试的指针。

更多背景细节:

我的 Dockerfile 从 alpine 基础开始,并添加了 python 开发包。它根据 denibertovic 的指南复制 entrypoint.sh 脚本。然后它跳转到entrpoint.sh 脚本。

FROM alpine

RUN apk update
RUN apk add bash
RUN apk add python3
RUN apk add python3-dev
RUN apk add su-exec

COPY entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chmod +x  /usr/local/bin/entrypoint.sh

ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]

entrpoint.sh 脚本将用户添加到容器中,并将 UID 作为环境变量传入。
#!/bin/bash

# Add local user
# Either use the LOCAL_USER_ID if passed in at runtime or
# fallback

USER_ID=${LOCAL_USER_ID:-9001}

echo "Starting with UID : $USER_ID"
adduser -s /bin/bash -u $USER_ID -H -D user
export HOME=/home/user

su-exec user "$@"

容器构建没有问题。
然后我使用以下命令行运行它:
sudo docker run -it -e LOCAL_USER_ID=`id -u` -v `realpath ../..`:/ws django-runtime /bin/bash

您会看到我传入了要映射到容器用户的 UID 的主机 UID,并且我要求将卷绑定(bind)挂载从本地工作目录挂载到容器中的/ws 挂载点。

从容器内的 bash shell 中,我可以看到/ws 由与我自己的“id”匹配的“用户”UID 所有。但是,当我列出/ws 的内容时,我收到 Permission Denied 错误,如下所示:
[dleclair@localhost runtime]$ sudo docker run -it -e LOCAL_USER_ID=`id -u` -v `realpath ../..`:/ws django-runtime /bin/bash
[sudo] password for dleclair:
Starting with UID : 1000
bash-5.0$ id
uid=1000(user) gid=1000(user) groups=1000(user)
bash-5.0$ ls -la .
total 0
drwxr-xr-x    1 root     root            27 Feb  8 09:15 .
drwxr-xr-x    1 root     root            27 Feb  8 09:15 ..
-rwxr-xr-x    1 root     root             0 Feb  8 09:15 .dockerenv
drwxr-xr-x    1 root     root            18 Feb  8 07:44 bin
drwxr-xr-x    5 root     root           360 Feb  8 09:15 dev
drwxr-xr-x    1 root     root            91 Feb  8 09:15 etc
drwxr-xr-x    2 root     root             6 Jan 16 21:52 home
drwxr-xr-x    1 root     root            17 Jan 16 21:52 lib
drwxr-xr-x    5 root     root            44 Jan 16 21:52 media
drwxr-xr-x    2 root     root             6 Jan 16 21:52 mnt
drwxr-xr-x    2 root     root             6 Jan 16 21:52 opt
dr-xr-xr-x  119 root     root             0 Feb  8 09:15 proc
drwx------    2 root     root             6 Jan 16 21:52 root
drwxr-xr-x    1 root     root            21 Feb  8 07:44 run
drwxr-xr-x    1 root     root            21 Feb  8 08:22 sbin
drwxr-xr-x    2 root     root             6 Jan 16 21:52 srv
dr-xr-xr-x   13 root     root             0 Feb  8 01:58 sys
drwxrwxrwt    2 root     root             6 Jan 16 21:52 tmp
drwxr-xr-x    1 root     root            19 Feb  8 07:44 usr
drwxr-xr-x    1 root     root            19 Jan 16 21:52 var
drwxrwxr-x    5 user     user           111 Feb  8 02:15 ws
bash-5.0$
bash-5.0$
bash-5.0$ cd /ws
bash-5.0$ ls -la
ls: can't open '.': Permission denied
total 0
bash-5.0$

感谢任何人可以提供的任何指针。谢谢!

最佳答案

经过更多搜索,我在这里找到了问题的答案:Permission denied on accessing host directory in Docker在这里:http://www.projectatomic.io/blog/2015/06/using-volumes-with-docker-can-cause-problems-with-selinux/ .

简而言之,问题在于卷挂载的 SELinux 默认标签阻止了对挂载文件的访问。解决方案是在 -v 命令行参数中添加一个 ':Z' 预告片,以强制 docker 针对已安装的文件设置适当的标志以允许访问。

因此命令行变为:

sudo docker run -it -e LOCAL_USER_ID=`id -u` -v `realpath ../..`:/ws:Z django-runtime /bin/bash

像魅力一样工作。

关于Docker:使用 --volume 绑定(bind)挂载的文件权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60129247/

相关文章:

docker - Kubernetes - pod 内每个容器一个请求

javascript - 在 HTTPS 实例中调用 HTTP Node 服务器,SSL 错误

Docker 上的 Solr :localhost:8983 not working

docker - Alpine : "service ` crond' 不存在”

php - 是否可以在现有的Alpine 3.12 Docker镜像上安装PHP7.4?

.net-core - 无法在基于 alpine 的 dotnet SDK 中运行 gRPC 协议(protocol)

ubuntu - "docker pull ubuntu "不起作用

docker - 如何映射从主机到docker的端口范围?

docker - qemu-irix无法在Alpine 3.10(GCC 8.3)下构建

bash - 适用于 awk v4.0.2 但不适用于 >= 4.2.1 的 awk 表达式