RHEL 6.5 上带有 SELinux 的 Docker 1.6.0 无法在没有 root 权限的情况下运行容器

RHEL 6.5 上带有 SELinux 的 Docker 1.6.0 无法在没有 root 权限的情况下运行容器

我正在尝试在 RHEL 6.5 上运行容器,但一直遇到这个问题:

sudo docker run -u postgres -it registry/postgres /bin/bash
/bin/bash: error while loading shared libraries: libtinfo.so.5: cannot open shared object file: Permission denied

以“root”用户身份运行时,容器启动正常,但尝试切换到另一个用户时问题再次出现:

$ sudo docker run -u root -it registry/database /bin/bash
[root@8a20410eaa5e /]# su postgres
su: /bin/bash: Permission denied

这是我们基于 CentOS 6.5 构建的一个特定容器,它运行 Postgres。构建它的 Dockerfile 中有“USER postgres”,除了这些服务器之外,它在其他地方运行良好。我可以用 busybox 容器重现相同的行为:

$ sudo docker run -u nobody -it 10.188.13.136:8080/busybox
/ $ ls
/bin/sh: ls: Permission denied

RHEL 6.5 主机已启用 SELinux。我们还有其他主机,SELinux 和此容器在这些主机上运行良好。此主机的审计日志看起来很干净,尝试运行容器时没有看到任何错误消息。

这是我们迄今为止尝试过的:

  • 更新 RHEL 中的 SELinux 策略(“sudo yum upgrade selinux-policy”),因为它们不是最新版本
  • 让 SELinux 进入宽容模式 (setenforce 0);没有尝试将其完全关闭并重新启动
  • 使用“--selinux-enabled=true”启动 Docker 守护进程
  • 使用 --privileged 启动容器
  • 使用 --security-opt=:label:disable 启动容器
  • 我们正在运行最新的 RHEL 6.5 内核:2.6.32-504.16.2.el6.x86_64

还在容器内为“su”命令运行 strace 会话,但除此之外看不到太多内容:

 17    setgid(10000)                     = 0
 17    setuid(10000)                     = 0
 17    munmap(0x7f07a3540000, 2101304)   = 0
 17    munmap(0x7f07a311c000, 2113776)   = 0
 17    munmap(0x7f07a2f03000, 2196352)   = 0
 17    munmap(0x7f07a2cea000, 2198192)   = 0
 17    munmap(0x7f07a2ae8000, 2101272)   = 0
 17    munmap(0x7f07a28e4000, 2109624)   = 0
 17    munmap(0x7f07a26e0000, 2109672)   = 0
 17    munmap(0x7f07a24d3000, 2148896)   = 0
 17    munmap(0x7f07a22d0000, 2105488)   = 0
 17    munmap(0x7f07a20cb000, 2113848)   = 0
 17    munmap(0x7f07a1ec5000, 2118168)   = 0
 17    munmap(0x7f07a3321000, 2221912)   = 0
 17    execve("/bin/bash", ["bash"], [/* 15 vars */]) = -1 EACCES (Permission denied)
 17    write(2, "su: ", 4)               = 4
 17    write(2, "/bin/bash", 9)          = 9

如果需要的话,完整的 strace 转储在这里:http://pastebin.com/42C2B8LP

我们不确定下一步该寻找什么,有什么想法吗?

答案1

我终于解决了这个问题。这意味着我似乎找到了解决方案,但我仍然不确定问题是什么:

1)从注册表 2.0 中拉出容器 + 使用 docker 1.6 运行 -> 失败

2)从注册表 0.9.x(Docker 自己的或我们内部运行的 Artifactory 服务器)中提取容器 + 使用 docker 1.6 运行 -> 运行

3)从注册表 2.0 中拉取容器 + 使用 docker 1.5 或更早版本运行 -> 失败

4) 从 registry 0.9.x 拉取容器 + 使用 docker 1.5 或更新版本运行 -> 运行

我不认为 Registry 2.0 有问题,但我没有更好的答案。新注册表比旧注册表快得多,但我想我们暂时还是会使用旧注册表。

相关内容