web-dev-qa-db-ja.com

Docker内のバックグラウンドで無限ループをテストしていますか?

Dockerイメージで動作するバックグラウンドキューを実行したい:

php artisan queue:work --daemon --sleep=1 --tries=3 &

その直後に、Apache httpdを起動してPHP laravelアプリを実行します。laravelアプリは、Push通知をRedisに送信します。バックグラウンドキューワーカーは、Redisからメッセージを収集し、Pushサービスを介して送信します。

それは機能し、毎秒ログアウトします。バックグラウンドコマンドがクラッシュした場合、再起動してください。この回答によると https://unix.stackexchange.com/a/223780/7204 次のようなコマンドを使用して、バックグラウンドでコマンドを無限に実行できます。

while true; do php $QUEUE_WORK; done &

これをテストするために、docker runを使用してコンテナを実行し、次にdocker exec -itを実行してログインし、次を表示します。

UID        PID  PPID  C STIME TTY          TIME CMD
100000       1     0  0 19:55 ?        00:00:00 httpd -D FOREGROUND
100000      21     1  0 19:55 ?        00:00:00 /bin/sh -e /tmp/scripts/run
100000      22    21  1 19:55 ?        00:00:01 php artisan queue:work --sleep=1 --tries=3
100000      43     1  0 19:55 ?        00:00:00 /usr/bin/cat
100000      50     1  0 19:55 ?        00:00:00 /usr/bin/cat
100000      51     1  0 19:55 ?        00:00:00 /usr/bin/cat
100000      52     1  0 19:55 ?        00:00:00 /usr/bin/cat
100000      53     1  0 19:55 ?        00:00:00 httpd -D FOREGROUND
...
100000     130     0  1 19:57 pts/0    00:00:00 /bin/bash
100000     144   130  0 19:57 pts/0    00:00:00 ps -efww

次にkill 22を実行して、次のdocker runの出力を確認します。

/tmp/scripts/run: line 10:    22 Killed                  php $QUEUE_WORK

ループはプロセスを維持しません。ループがイメージで実行されているコードであることを再確認しました。ループを実行すると、「エコーx:スリープ1」が実行されます。

Killしたときに、ループがコマンドを置き換えないのはなぜですか?

注:アプリケーションは、httpdヘルスチェックURLがエラーまたはタイムアウトを返した場合に監視と自動再起動を行う複数のポッドとしてデプロイされます。

キューワーカーを個別のポッドとして、またはサイドカーコンテナーとしてデプロイしたくないので、httpdコンテナーのバックグラウンドプロセスとして実行して、アプリケーションコードをhttpdと共有し、構成をゼロにします。

プロセスモニターやその他のツールやテクノロジーを実行して「キープアライブ」を行うことに興味はありません。

私の質問は、Bashループが実行中のプロセスのkillで終了するのはなぜですか?

2
simbo1905

セットアップ

次のDockerfileを設定しました:

$ more Dockerfile
From centos
ADD run.sh /tmp/run.sh
RUN chmod +x /tmp/run.sh
ENTRYPOINT ["/tmp/run.sh"]

スクリプトをセットアップしますrun.sh

$ cat run.sh
while true; do sleep 15 ; echo "background"; done &

while true; do sleep 12 ; echo "foreground"; done

それを作った:

$ docker build -t sleeper .
Sending build context to Docker daemon 7.791 MB
Step 1/4 : FROM centos
 ---> 49f7960eb7e4
Step 2/4 : ADD run.sh /tmp/run.sh
 ---> b4099de53780
Removing intermediate container 1ce8e3a1dac5
Step 3/4 : RUN chmod +x /tmp/run.sh
 ---> Running in e410429a6cba

 ---> 06789467e636
Removing intermediate container e410429a6cba
Step 4/4 : ENTRYPOINT /tmp/run.sh
 ---> Running in ad8b847b505f
 ---> a2415df63f99
Removing intermediate container ad8b847b505f
Successfully built a2415df63f99

それからそれを始めました:

$ docker run -dit sleeper
28c19c338e6e6177529cf989f42c7f14b17f1c705a61f5244d5350f0ab8f8364

その後、繰り返し実行されます:

foreground 
background 
foreground 
background

これを見ると、sleepコマンドが最終的に「死にかけている」にも関わらず、稼働していることがわかります。

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
28c19c338e6e        sleeper             "/tmp/run.sh"       About a minute ago   Up About a minute                       focused_lumiere

上から、このコンテナが1分を超えて稼働していることがわかります。コンテナ内部のps auxfは次のようになります。

$ ps auxf
...
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root        24  0.0  0.1  11828  2964 pts/1    Ss   16:00   0:00 /bin/bash
root        58  0.0  0.1  51712  3432 pts/1    R+   16:01   0:00  \_ ps auxf
root         1  0.0  0.1  11692  2572 pts/0    Ss+  15:58   0:00 /bin/bash /tmp/
root         5  0.0  0.1  11696  2272 pts/0    S+   15:58   0:00 /bin/bash /tmp/
root        56  0.0  0.0   4368   636 pts/0    S+   16:01   0:00  \_ sleep 15
root        57  0.0  0.0   4368   664 pts/0    S+   16:01   0:00 sleep 12

次のように背景を削除するとsleep 15になります。

$ kill 56

そして、別のdocker psを実行します。

$ docker ps
...
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root        24  0.0  0.1  11828  2964 pts/1    Ss   16:00   0:00 /bin/bash
root        60  0.0  0.1  51712  3344 pts/1    R+   16:01   0:00  \_ ps auxf
root         1  0.0  0.1  11692  2572 pts/0    Ss+  15:58   0:00 /bin/bash /tmp/
root         5  0.0  0.1  11696  2272 pts/0    S+   15:58   0:00 /bin/bash /tmp/
root        59  0.0  0.0   4368   636 pts/0    S+   16:01   0:00  \_ sleep 15
root        57  0.0  0.0   4368   664 pts/0    S+   16:01   0:00 sleep 12

バックグラウンドsleep 15プロセスを保護しているwhileループがその処理を実行し、別のsleep 15を再起動したことがわかります。

3
slm