容器中的Docker“权限被拒绝”

5

我正在尝试通过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时,依然被拒绝。


你正在运行哪个镜像? - Bruno Lubascher
1
也许在 Dockerfile 中有一个 USER 指令,而该用户不被允许从另一个用户访问 examples 目录?您可以使用 --user=root 进行测试,以取代可能的 USER - mviereck
@BrunoGL 这是某些软件的官方预构建镜像。 - pp35377
@mviereck 谢谢,看起来可以工作!有没有一种方法可以修复它而不是绕过它? - pp35377
2个回答

5
在评论中发现镜像的 Dockerfile 中可能有一个 USER 指令。由于 examples 的文件访问权限,该用户无法访问 examples
可以使用 docker run 选项 --user 来取代 USER
一种快速而不太好的解决方案是使用 --user=root 运行以允许任意访问。 请注意,在容器中写入到文件夹 examples 中的文件将归属于 root
更好的解决方案是查找 examples 的所有者,并称其为 foo。指定其用户 ID 和组 ID 以在容器中具有完全相同的用户:
docker run --user $(id -u foo):$(id -g foo)  imagename

另一个可能的解决方案是使用 chmod 666 examples 或者 chmod 644 examples 允许任意访问,但很可能你不希望这样做。


最好的方法是查看 Dockerfile 并检查 USER 指令的目的。

  • 如果它只是为了避免容器中使用 root,那么最好的方法是使用 --user=foo 或更精确地说 --user=$(id -u foo):$(id -g foo)
  • 如果 Dockerfile/image 中的某些内容依赖于特定的 USER,则最好更改 examples 的访问权限。
  • 如果你可以访问 Dockerfile,则可以调整它以适应你的主机用户/ examples 的所有者。

2

尝试以特权模式运行容器:

sudo docker run --privileged=true -itd -v /***/***:/***  ubuntu bash

例如:sudo docker run --privileged=true -itd -v /home/willie:/wille ubuntu bash

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