ブロッキング プロセス (サーバー) を開始し、同じスクリプトから curl を実行するにはどうすればよいでしょうか?

ブロッキング プロセス (サーバー) を開始し、同じスクリプトから curl を実行するにはどうすればよいでしょうか?

私は Docker で DeepDetect (機械学習サーバー) を操作しようとしています [これは DeepDetect に関する質問ではなく、単に Bash に関する質問です]。ただし、より一般的な Linux/bash の問題に直面しており、その解決に協力していただきたいと思っています。

私がやるべきことは次のとおりです:

  1. Dockerfile ENTRYPOINT 経由で起動されたシェル スクリプトから、DeepDetect サーバーを起動し、それをブロックします (サーバーなので永久に実行されるはずです)。これを実行するスクリプトをルート プロセスにして、クラッシュした場合に Docker がコンテナーを再起動するようにします。

  2. サーバーが実行中の場合は、同じスクリプトから、現在実行中の上記のサーバーに次のような curl を送信します。

curl -X PUT "http://localhost/services/age" -d '{ "mllib":"caffe", "description":"年齢分類", "type":"supervised", "parameters":{ "input":{ "connector":"image", "height":227, "width":227 }, "mllib":{ "nclasses":8 } }, "model":{ "repository":"/models/age_model" } }'

さて、ここで問題があります。サーバーが永久に実行されている場合、どのようにして curl を実行できるのでしょうか。サーバーが起動する前に、バックグラウンドで別のプロセスを何らかの方法で開始し、サーバーの起動後にそのプロセスに戻って上記の curl 式を実行する必要があるようです。

この「30 秒でスクリプトを呼び出す」問題を解決する方法をご存知の方はいらっしゃいますか? ご協力いただければ幸いです。

答え1

基本的な質問については:

#!/usr/bin/env bash
./start-server.sh &
sleep 30
curl […]
wait

必然的に、 には問題が生じますsleep 30。サーバーの起動に時間がかかったり、 の実行時にちょうど再起動の処理中であったりする場合があります。再試行したり、サーバーが使用可能かどうか (通常は別の を使用) を確認したりして、必要な操作を実行する前にcurl多くの複雑さを追加できます。curl

答え2

DeepDetect サーバーはコンテナ内でデーモン化する必要があります (pid 1 として実行)。

CMD ["deepdetect"]

エントリポイント スクリプトでは、単純な while ループを使用してサーバーを待機できます。

while ! $(curl --output /dev/null --silent --head --fail 
http://localhost:80); do
    >&2 echo "Server is unavailable - sleeping"
    sleep 1
done

私はこれを確認していませんが、とにかくこのアイデアを試すことができます。また、エントリポイントと cmd (シェルではない) には exec 形式を使用する必要があります。

ENTRYPOINT ["/entrypoint.sh"]

関連情報