SELinux 搭載の RHEL 6.5 上の Docker 1.6.0 では、ルート権限なしではコンテナを実行できません

SELinux 搭載の RHEL 6.5 上の Docker 1.6.0 では、ルート権限なしではコンテナを実行できません

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 を permissive モードにする (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 に問題があるとは思いませんが、他に良い答えはありません。新しいレジストリは古いものよりはるかに高速ですが、当面は古いレジストリを使い続けることになると思います。

関連情報