帶有 SELinux 的 RHEL 6.5 上的 Docker 1.6.0,無法在沒有 root 的情況下運行容器

帶有 SELinux 的 RHEL 6.5 上的 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 update 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) 從登錄 0.9.x 中拉取容器 + 使用 docker 1.5 或更高版本運行 -> 有效

我真的不認為Registry 2.0有問題,但我沒有更好的答案。新的註冊表比舊的快得多,但我想我們暫時會堅持使用舊的註冊表。

相關內容