我对 Python 和 Pyramid 很陌生,如果我在这里做错事,我深表歉意。
我目前正在 Docker 容器内运行 Pyramid 应用程序,具有以下入口点:
pipenv run pserve development.ini --reload
这可以正确地为我的应用程序提供服务,然后我可以直接在容器内编辑代码。这一切都很好。然后我尝试将此服务注册到 Netflix 的 Eureka 服务注册表的一个实例,这样我就可以使用网关(例如 Netflix Zuul)代理到该服务。我使用 Eureka 的 REST API 来实现这一点,这一切都很好。
但是,当我关闭 Pyramid 服务时,我想向 Eureka 发送一个额外的 HTTP 请求以删除已注册的服务 - 这是理想的,所以我不必等待 Eureka 到期并且永远不会有一个窗口Zuul 可能会将请求代理到已关闭的服务。
问题是我无法可靠地找到在 Pyramid 中运行关闭事件的方法。基本上,当我停止 Docker 容器时,服务会收到退出代码 137(我相信这是 kill -9 的结果)并且什么也没有发生。我尝试过使用 atexit 以及信号事件,例如 SIGKILL、SIGTERM、SIGINT 等,但什么也没发生。我也试过在没有 --reload 标志的情况下运行 pserve ,但这仍然不起作用。
无论如何,我是否可以在服务器和 docker 容器关闭之前可靠地发送此 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