2017-03-08 13 views
1

私は1つのドッカーコンテナを持つホストマシンを持っています。コンテナはアクティブであり、特定のサービスを実行しています。特定の条件を満たすと、コンテナを取り出してマシンをシャットダウンする必要があります。それは可能ですか? マシンのシャットダウンを処理するサービスを実行するコードを変更する予定ですか?どんな提案も歓迎です!ドッキング・コンテナの1つでコマンドを実行してホスト・マシンをシャットダウンすることはできますか?

+1

'privileged'フラグを持つコンテナは、必要に応じて関連するハードウェアの要求を直接行うことで、ホストをシャットダウンすることができます。このフラグ(またはホスト上で実行されている他のコード)なしで動作したコンテナ*からホストのシャットダウンをトリガするメカニズムは、バグを構成します。 –

答えて

0

これを試しましたか?

sudo docker rm -v container 
sudo shutdown 
+0

これは手動コマンドであり、ホスト上で実行されます。 OPはそれをコンテナから、プログラム的に行う方法を求めている。 –

+0

Mmmm。しかし、特権モードで、seccompとselinux/apparmourを無効にしてコンテナを実行する必要があります。これは安全で無意味です。また、Dockerソケットをマウントしたり、TCP経由で利用できるようにしたり、APIを使用したりしない限り、コンテナは自分自身を削除することはできません。すべてがホストから行われなければなりません。 –

+0

さて、コンテナからそれをする_is_は、OPが求めていたものです。それが賢明かどうかは別の質問です。 –

3

クリーンシャットダウンの実行は、ホストのinitシステムによって異なります。

コンテナにアクセスすることを避け、コンテナにホスト固有のinitツールをインストールしないようにするには、コンテナにシャットダウンを実行させるのではなく、シャットダウンするようにホストに通知するインターフェイスを作成できます。

インターフェイス

これはさまざまな方法で実行できます。簡単な出発点は、コンテナとホストの間でデータを共有するマウントされたボリュームです。ファイルは今のところ行いますが、ソケット、FIFO、TCP、または他のIPCメソッドを使用できます。

あなたが必要その後シャットダウン

docker exec $cid sh -c 'echo true > /shutdown_signal' 

にホストをしたいときに、ファイルに文字列を書き込み、ホスト上のファイルを作成します/var/run/shutdown_signalを言うと、あなたのコンテナ

docker run -d -v /var/run/shutdown_signal:/shutdown_signal whatever 

にファイルをマウントしますファイルを監視するためにホスト上で動作しているもの。

inotifywaitでファイルの変更を待つ単純なスクリプト。

echo "waiting" > /var/run/shutdown_signal 
while inotifywait -e close_write /var/run/shutdown_signal; do 
    signal=$(cat /var/run/shutdown_signal) 
    if [ "$signal" == "true" ]; then 
    echo "done" > /var/run/shutdown_signal 
    shutdown -h now 
    fi 
done 

inotifywaitが利用できない場合、ファイルをポーリングできます。

while sleep 30; do 
    signal=$(cat /var/run/shutdown_signal) 
    ... 

恐ろしい代替

のLinuxですぐに、汚れたシャットダウンをトリガするために、より普遍的な、カーネル方法もあります。

docker run --privileged busybox \ 
    sh -c 'echo 1 > /proc/sys/kernel/sysrq; echo o > /proc/sysrq-trigger' 

しかし、これは価値があるよりも多くの問題を引き起こす可能性があります。

+0

コンテナとホストの間にインタフェースがあり、ホスト上でスクリプトが実行されている場合、ホストからよりクリーンな方法ですべてを実行できるかどうかは分かりません。 –

+0

@RicardoBranco OPはコンテナ内で動作しているサービスからそれを行うように求めました。 – Matt

+0

OPは、ホストとのインターフェイスを作成せずにこれが不可能であることを伝える必要があります。しかし、インタフェースは無意味です。なぜなら、とにかく、すべてがホスト上で適切な方法で実行できるからです。 –

関連する問題