Hypercorn 带有“--reload”和 Docker 卷

问题描述

我在 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 错误。如果我在 uvicorn[standard] 中添加 requirements.txt 并运行 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!!!')

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)