【问题标题】:Hypercorn with "--reload" and Docker volumes带有“--reload”和 Docker 卷的 Hypercorn
【发布时间】: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


    【解决方案1】:

    您可能需要使用volume mount 来获得重新加载功能!

    这是因为当您构建容器时,它会将您在本地拥有的任何内容烘焙到其中。进一步的更改只会影响您的本地文件系统。


    这可能不是预期用途(因为容器变得依赖于外部文件!),但可能对更快的测试/调试有用

    您也可以通过连接到它来直接编辑容器,您可能会发现它适合您的需求。

    【讨论】:

    • 我已经在 Docker Compose 文件中使用volumes: [./runtime:app/runtime] 的卷。你是说我应该改用命名卷吗?
    • 哦,知道我没有正确阅读您的帖子;我会首先检查放入卷中的文件是否确实在您期望的位置并确实出现在容器中(可能直接检查容器)..如果不是,请先开心,否则您可能需要更改您的存储驱动程序以启用重新加载所依赖的任何功能以检测更改docs.docker.com/storage/storagedriver/select-storage-driver
    • 谢谢。我确实确认文件在它们应该在的位置并且正在同步更新。不幸的是,我正在使用 Docker Desktop for Mac 并且无法修改存储驱动程序。也许这就是问题所在?
    • 这似乎是合理的 - 有问题的代码似乎在这里! github.com/pgjones/hypercorn/blob/…如果你想实验
    • 来自 Hypercorn 错误跟踪器的相关问题:gitlab.com/pgjones/hypercorn/-/issues/185
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    • 2019-02-12
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多