2

私は Python と Pyramid に慣れていないので、ここで間違ったことをしようとしている場合は申し訳ありません。

現在、次のエントリポイントを使用して、Docker コンテナー内で Pyramid アプリケーションを実行しています。

pipenv run pserve development.ini --reload

これにより、アプリケーションが正しく機能し、コンテナー内でコードを直接編集できるようになります。これはすべてうまくいきます。次に、このサービスを Netflix の Eureka Service Registry のインスタンスに登録して、ゲートウェイ (Netflix Zuul など) を使用してこのサービスにプロキシできるようにしました。私はこれを達成するために Eureka の REST API を使用しましたが、これはすべて正常に機能しました。

ただし、Pyramid サービスをシャットダウンするときは、追加の HTTP 要求を Eureka に送信して、登録済みのサービスを削除したいと考えています。 Zuul がダウンしたサービスにリクエストをプロキシしている可能性があります。

問題は、Pyramid でシャットダウン イベントを実行する方法を確実に見つけることができないことです。基本的に、Docker コンテナーを停止すると、サービスは終了コード 137 (kill -9 の結果だと思います) を受け取り、何も起こりません。atexit と SIGKILL、SIGTERM、SIGINT などのシグナル イベントを使用しようとしましたが、何も起こりません。--reload フラグを指定せずに pserve を実行してみましたが、それでもうまくいきません。

サーバーとドッカーコンテナーがシャットダウンする直前に、この DELETE イベントを確実に送信する方法はありますか?

これは私が使用している development.ini ファイルです:

[app:main]
use = egg:my-app
pyramid.reload_templates = true
pyramid.includes =
    pyramid_debugtoolbar
    pyramid_redis_sessions
    pyramid_tm

debugtoolbar.hosts = 0.0.0.0/0

sqlalchemy.url = mysql://root:root@mysql/keyblade

my-app.secret = secretkey

redis.sessions.secret = secretkey
redis.sessions.host = redis
redis.sessions.port = 6379

[server:main]
use = egg:waitress#main
listen = 0.0.0.0:8000

# Logging Configuration

[loggers]
keys = root, debug, sqlalchemy.engine.base.Engine

[logger_debug]
level = DEBUG
handlers =
qualname = debug

[handlers]
keys = console

[formatters] 
keys = generic

[logger_root]
level = INFO
handlers = console

[logger_sqlalchemy.engine.base.Engine]
level = INFO
handlers =
qualname = sqlalchemy.engine.base.Engine

[handler_console]
class = StreamHandler
args = (sys.stderr,)
level = NOTSET
formatter = generic

[formatter_generic]
format = %(asctime)s %(levelname)-5.5s [%(name)s][%(threadName)s] %(message)s
4

2 に答える 2

3

WSGI アプリケーションのシャットダウン プロトコル/API はありません (技術的には、サーバーがリクエストの処理を開始するのとほぼ同時にアプリケーションの作成を使用/希望しているにもかかわらず、起動用のプロトコルもありません)。いくつかのフックを提供する WSGI サーバーを見つけることができるかもしれません (例えば、gunicorn はhttp://docs.gunicorn.org/en/stable/settings.html#worker-exitを提供します)。ヘルスチェックを介して消えるサーバーを処理します。問題が発生したときに DELETE を確実に送信できると期待することは、堅牢なソリューションになる可能性はほとんどありません。

于 2018-08-09T20:07:15.313 に答える