我正在尝试在 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 有问题,但我没有更好的答案。新注册表比旧注册表快得多,但我想我们暂时还是会使用旧注册表。