我正在尝试通过以下方式运行 docker 镜像

docker run  -it -v $PWD/examples:/home/user/examples image

这应该使主机中的 $PWD/examples 可以在容器中访问。但是,当我在容器中使用 ls 时,它​​不断给我
ls: cannot access 'examples': Permission denied

我已经尝试过类似问题的答案, z/Z 选项和 chcon -Rt svirt_sandbox_file_t /host/path/run --privileged ,但在我的情况下,它们都没有任何影响。
事实上, z 选项似乎第一次工作 ls ,但是当我第二次发出 ls 时它再次被拒绝。

最佳答案

在评论中发现图像的 USER 中可能有一条 Dockerfile 指令。由于 examples 的文件访问权限,不允许该用户访问 examples

可以使用 docker run 选项 USER 取代 --user

一个快速而肮脏的解决方案是使用 --user=root 运行以允许任意访问。
请注意,在容器中以 root 形式写入文件夹 examples 的文件将由 root 拥有。

更好的解决方案是寻找 examples 的所有者,称他为 foo 。指定其用户 id 和组 id 以在容器中具有完全相同的用户:

docker run --user $(id -u foo):$(id -g foo)  imagename

另一种可能的解决方案是允许使用 chmod 666 exampleschmod 644 examples 进行任意访问,但很可能您不想要那样。

最好的方法是查看 Dockerfile 并检查 USER 指令的用途。
  • 如果它只是为了避免容器中的 root,最好的方法是使用 --user=foo 或更准确地说 --user=$(id -u foo):$(id -g foo)
  • 如果 Dockerfile/image 中的某些内容依赖于特定的 USER ,那么最好更改 examples 的访问权限。
  • 如果您有权访问 Dockerfile,您可以调整它以适合您的主机用户/examples 的所有者。
  • 关于linux - 容器中的 Docker "permission denied",我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51596279/

    10-10 22:39