docker -composeを使用してgunicorn(19.7.1)pythonアプリケーションをシャットダウンすると、シャットダウンに常に10秒かかることがわかりました。これは、docker-composeがプロセスを強制的に強制終了する前に待機するデフォルトの最大時間です(-t / --timeout
パラメーターで調整)。これは、gunicornが正常にシャットダウンされていないことを意味していると思います。私はこれを次のように再現できます:
docker-compose.yml:
version: "3"
services:
test:
build: ./
ports:
- 8000:8000
Dockerfile:
FROM python
RUN pip install gunicorn
COPY test.py .
EXPOSE 8000
CMD gunicorn -b :8000 test:app
test.py
def app(_, start_response):
"""Simplest possible application object"""
data = b'Hello, World!\n'
status = '200 OK'
response_headers = [
('Content-type', 'text/plain'),
('Content-Length', str(len(data)))
]
start_response(status, response_headers)
return iter([data])
次に、次のコマンドでアプリを実行します。
docker-compose up -d
そしてそれを優雅に止める:
docker-compose stop
バージョン:
docker-compose version 1.12.0, build b31ff33
gunicornが正常に停止することを許可したいと思います。base.pyのシグナルハンドラーに基づいて作成できるはずだと思います。
上記のすべては、docker-compose up -d
2回使用してイメージを更新する場合にも当てはまります。2回目は、古いイメージを置き換える新しいイメージで更新します。
私は何かを誤解/誤用していますか?docker-composeはプロセスを停止するためにどのようなシグナルを送信しますか?gunicornはそれを使うべきではありませんか?アプリケーションを10秒より速く再起動できる必要がありますか?
exec
dockerfileのCMDの後に追加します:CMD exec gunicorn -b :8000 test:app
。
私は同じ問題を抱えていましたdocker exec my_running_gunicorn ps aux
、私が走ったとき、私は次のようなものを見ました:
gunicorn 1 0.0 0.0 4336 732 ? Ss 10:38 0:00 /bin/sh -c gunicorn -c gunicorn.conf.py vision:app
gunicorn 5 0.1 1.1 91600 22636 ? S 10:38 0:00 /usr/local/bin/python /usr/local/bin/gunicorn -c gunicorn.conf.py vision:app
gunicorn 8 0.2 2.5 186328 52540 ? S 10:38 0:00 /usr/local/bin/python /usr/local/bin/gunicorn -c gunicorn.conf.py vision:app
1 PIDはgunicornマスターではないため、sigtermシグナルを受信しませんでした。
でexec
Dockerfileで、私が今持っています
gunicorn 1 32.0 1.1 91472 22624 ? Ss 10:43 0:00 /usr/local/bin/python /usr/local/bin/gunicorn -c gunicorn.conf.py vision:app
gunicorn 7 45.0 1.9 131664 39116 ? R 10:43 0:00 /usr/local/bin/python /usr/local/bin/gunicorn -c gunicorn.conf.py vision:app
そしてそれは動作します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加