次のようにDockerコンテナ内でファイルシステムキャッシュを消去しようとします。
docker run --rm ubuntu:vivid sh -c "/bin/echo 3 > /proc/sys/vm/drop_caches"
このコマンドを実行すると
sh: 1: cannot create /proc/sys/vm/drop_caches: Read-only file system
/proc
これはコンテナ内部で書き込めないため、予想される現象です。
今私が電話するとき
docker run --rm --privileged ubuntu:vivid sh -c "/bin/echo 3 > /proc/sys/vm/drop_caches"
--privileged
コンテナがホストシステムで(ほぼ)すべての操作を実行できるため、これは機能します。
私の質問は次のとおりです。コマンドでどのLinux機能を設定する必要があるのか、どうすればわかりますか?
docker run --rm --cap-add=??? ubuntu:vivid sh -c "/bin/echo 3 > /proc/sys/vm/drop_caches"
設定なしでこれを行うには--privileged
?
答え1
Gillesが受け入れた答えに対する付録:dockerを使用するとき、より簡単な方法で作成/proc/sys/vm/drop_caches
(または/proc
一般的に正確に言えば)目標を達成しました。
docker run -ti --rm -v /proc:/writable_proc ubuntu:vivid bash
# echo 3 > /writable_proc/sys/vm/drop_caches
それが私の目的のためです。
役に立つ回答に心から感謝します!
答え2
ファイルproc
システムは機能、ACL、または使用法をサポートしませんchmod
。 Unix権限は、呼び出しプロセスがアクセスできるかどうかを決定します。したがって、ルートのみがこのファイルに書き込むことができます。ユーザーネームスペースの場合、これはグローバルルート(元のネームスペースのルート)です。コンテナのルートは sysctl 設定を変更できません。
私が知っている限り、権限のない名前空間内でsysctl設定を変更する唯一の解決策は、通信チャネル(たとえばソケットまたはパイプ)を外部にソートし、受信プロセスがコンテナ外のルートとして実行されるようにすることです。
答え3
次のことをテストしました。
docker run -ti --rm -v /proc:/writable_proc rhel bash
echo 3 > /writable_proc/sys/vm/drop_caches
さらに失敗します:
bash: /writable_proc/sys/vm/drop_caches: Permission denied
私は権限を持ってそれを実行します:
docker run -ti --rm --privileged -v /proc:/writable_proc rhel bash
echo 3 > /writable_proc/sys/vm/drop_caches
また、すべてが機能するので、Gillesのデーモンまたはcliは、Gillesが知らない間に権限を使用するように構成されているため、Gillesに対してすべてが機能していると確信しています。