【发布时间】:2021-05-12 15:14:57
【问题描述】:
我在 Docker 容器中使用 --reload 运行 Hypercorn。我正在运行的文件保存在由 Docker Compose 管理的卷中。
当我更改系统上的文件时,我可以看到更改反映在卷中,例如docker compose exec myapp /bin/cat /app/runtime/service.py。
但是,当我以这种方式更改文件时,Hypercorn 不会像我预期的那样重新启动。 Hypercorn 和 Docker 卷之间是否存在一些不利的相互作用?或者我是否期待 --reload 选项提供一些我不应该期待的东西?
示例文件如下。我的期望是从容器外部修改runtime/service.py 会触发Hypercorn 使用修改后的文件版本重新启动服务器。但这不会发生。
编辑:我应该补充一点,我在 MacOS 10.14.6 上通过 Docker Desktop for Mac 使用 Docker 20.10.5。
编辑 2:这可能是 Hypercorn 错误。如果我在requirements.txt 中添加uvicorn[standard] 并运行python -m uvicorn --reload --host 0.0.0.0 --port 8001 service:app,则重新加载工作正常。可能相关:https://gitlab.com/pgjones/hypercorn/-/issues/185
entrypoint.sh:
#!/bin/sh
cd /app/runtime
/opt/venv/bin/python -m hypercorn --reload --bind 0.0.0.0:8001 service:app
Dockerfile:
FROM $REDACTED
RUN /opt/venv/bin/python -m pip install -U pip
RUN /opt/venv/bin/pip install -U setuptools wheel
COPY requirements.txt /app/requirements.txt
RUN /opt/venv/bin/pip install -r /app/requirements.txt
COPY requirements-dev.txt /app/requirements-dev.txt
RUN /opt/venv/bin/pip install -r /app/requirements-dev.txt
COPY entrypoint.sh /app/entrypoint.sh
EXPOSE 8001/tcp
CMD ["/app/entrypoint.sh"]
docker-compose.yml:
version: "3.8"
services:
api:
container_name: api
hostname: myapp
build:
context: .
ports:
- 8001:8001
volumes:
- ./runtime:/app/runtime
runtime/service.py:
import logging
import quart
logger = logging.getLogger(__name__)
logging.basicConfig(level=logging.INFO)
app = quart.Quart(__name__)
@app.route('/')
async def handle_hello():
logger.info('Handling request.')
return 'Hello, world!\n'
@app.route('/bad')
async def handle_bad():
logger.critical('Bad request.........')
raise RuntimeError('Oh no!!!')
【问题讨论】:
标签: python docker docker-compose hypercorn