2017-02-08 6 views
0

SmartHomeアプリケーション "FHEM"を実行するDocker Containerに問題があります。問題は、開始後、最初のプロセスがバックグラウンドにフォークし、その後、ドッカーコンテナが停止することです。Docker forking process

どうすればこの問題を防ぐことができますか?

+0

はあなたがここにhttpドッカファイルを見つけることができます全体 'ドッキングウィンドウのrun' – user2915097

+0

で少なくともDockerfile、再生を示しています// github.com/Phill93/docker-fhem – Phill93

+0

Linuxシステム(コンテナではない)で 'sudo -u" $ FHEMUSER "-H perl" $ FHEMFILE "" "$ CONFIGFILE"を起動すると動作しますか? – user2915097

答えて

0

@Tanktalusが正しいです。あなたのソフトウェアをフォークにしないことが最良の方法です。

ただし、これが不可能な場合は、提供処理中にコンテナ起動スクリプトを実行する必要があります。これには2つの注意点があります。

  1. サービスプロセスが終了すると、スクリプトは終了する必要があります。さもなければ、ドッカーはその終了を知らず、コンテナは稼働し続けるでしょう。サービスが--restart=alwaysのようなオプションで実行されていることを確認することは効果がありません。
  2. 同様の注記では、スクリプトもサービングプロセスと同じ終了コードで終了すると便利です。これにより、デバッグの問題がより簡単になる可能性があります。

幸運にも、幸いなことに、これにはbashコマンドwaitがあります。のは、例を持ってみましょう:ここに何が起こる

$ cat docker_test.sh 
perl -e "sleep(5); exit(42);" & 
wait `pgrep perl` 

は、1)pgrep perlは、バックグラウンドでperlプロセス睡眠のPIDを検索し、そのプロセスを終了させるため2)waitが待機するということです。さらに、waitは、終了コードperlを返します。我々は必要なすべて:私たちは、この取得ドッキングウィンドウで

$ ./docker_test.sh 
$ echo $? 
42 

$ docker run -d -v `pwd`/docker_test.sh:/docker_test.sh ubuntu bash /docker_test.sh 
537bdfc04554461da7dd6728ca721e4789a08e426adcc01a3359ed22fd16aa1f 
[waiting 5 secs] 
$ docker ps -a 
CONTAINER ID  IMAGE    COMMAND     CREATED    STATUS       PORTS    NAMES 
537bdfc04554  ubuntu    "bash /docker_test.sh" 41 seconds ago  Exited (42) 34 seconds ago       happy_almeida 
+0

それは私に役立ちます。 – Phill93

0

ソフトウェアを支配している場合は、「バックグラウンドにフォークしない」モードのソフトウェアをエミュレートしてバックグラウンドフォークをスキップするフラグをスタートアップに追加することができます。これはおそらく最も単純なものでしょう。

また、アプリケーションを起動するエントリポイントスクリプトを作成し、アプリケーションの起動後にwhile true; do sleep 1000; doneを追加するだけで済みます。このようにして、エントリポイントは決して戻らず、ドッカーコンテナは引き続き実行されます。