我正在构建一个 gRPC Python 应用程序,并尝试将
watchdog
与 watchmedo
扩展一起使用来侦听代码更改并重新加载,就像在这个问题中描述的那样。
当服务器加载并且我对某些文件进行更改时,我可以在 docker 日志中看到异常跟踪(我添加了
print('Starting server...')
行作为指导):
Starting server...
Traceback (most recent call last):
File "/code/main.py", line 4, in <module>
serve()
File "/code/app/server.py", line 20, in serve
server.wait_for_termination()
File "/code/.venv/lib/python3.12/site-packages/grpc/_server.py", line 1485, in wait_for_termination
return _common.wait(
^^^^^^^^^^^^^
File "/code/.venv/lib/python3.12/site-packages/grpc/_common.py", line 156, in wait
_wait_once(wait_fn, MAXIMUM_WAIT_TIMEOUT, spin_cb)
File "/code/.venv/lib/python3.12/site-packages/grpc/_common.py", line 116, in _wait_once
wait_fn(timeout=timeout)
File "/usr/local/lib/python3.12/threading.py", line 655, in wait
signaled = self._cond.wait(timeout)
^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/threading.py", line 359, in wait
gotit = waiter.acquire(True, timeout)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
KeyboardInterrupt
Starting server...
看似是识别文件变化,但最终并没有刷新代码。
我通过添加一个断言失败的单元测试来测试这一点,然后再次运行测试。不会失败。
我正在使用
poetry
,我的 docker-compose.yml
文件如下所示:
service:
build: .
depends_on:
postgres:
condition: service_healthy
command: poetry run watchmedo auto-restart -d "/app" -p '*.py' --recursive -- python main.py
volumes:
- .:/app
ports:
- '8010:8010'
项目结构为:
├── app
├── protos
└── main.py
Dockerfile
的相关部分:
FROM python:3.12.3-slim-bookworm
RUN pip install poetry==1.8.3
WORKDIR /code
COPY ... ./
RUN poetry install ...
COPY app ./app
COPY protos ./protos
COPY main.py ./
相关软件包版本:
[tool.poetry.dependencies]
python = "^3.12"
grpcio = "^1.63.0"
grpcio-tools = "^1.63.0"
watchdog = {extras = ["watchmedo"], version = "^4.0.1"}
有一些 grpc 经验的人可以帮我弄清楚发生了什么吗?
问题在于我如何安装卷。路径修正表明一切正常。 回溯与此无关。