【问题标题】:How to fix hot-reload problem on a Flask application inside Docker?如何解决 Docker 内 Flask 应用程序的热重载问题?
【发布时间】:2019-05-27 20:54:16
【问题描述】:

我希望我的烧瓶应用程序在 docker 容器内通过热重载运行,但如果我将我的 app.py 烧瓶应用程序更改为 app.run(debug=True,host='0.0.0.0') 而不是 False,则会引发错误:

FileNotFoundError: [Errno 2] No such file or directory: '/app/app.py': '/app/app.py'


如果我改回False

app.run(debug=False,host='0.0.0.0')

它将运行,但无需热重载。

我的 Dockerfile 是:

    FROM ubuntu:latest
    RUN apt-get update -y
    RUN apt-get install -y python3-pip python3-dev build-essential locales
    RUN locale-gen en_US.UTF-8  
    ENV LANG en_US.UTF-8  
    ENV LANGUAGE pt_BR:pt:en  
    ENV LC_ALL en_US.UTF-8
    ENV FLASK_ENV="development"
    WORKDIR /app 
    COPY . /app
    VOLUME ["/app"]
    RUN pip3 install -r requirements.txt
    ENTRYPOINT ["python3"]
    CMD ["app.py"]

我使用以下命令运行它:
docker run -p 5000:5000 -v /Users/rodrigodmpa/Documents/IA/web:/app flask-app

【问题讨论】:

    标签: python-3.x docker flask docker-compose dockerfile


    【解决方案1】:

    我发现 Dockerfile 有一些问题。我认为您的直接问题是VOLUME ["/app"] 行。您已将代码静态复制到映像中,并声明运行该映像的容器将在 /app 位置导出卷,然后将具有绑定挂载卷的容器启动到同一位置。可能存在一些权限问题,最终导致容器不再看到/app 的内容。你不需要 VOLUME 声明,所以放弃它。

    另外:始终将apt-get updateapt-get install 放在同一个RUN 声明中。如果你不这样做,然后编辑安装的包,那么默认情况下 Docker 将缓存来自上一个命令的层。这意味着您可能会根据很久以前的包定义安装包。它应该看起来像 RUN apt-get update -y && apt-get install -y python3-pip python3-dev build-essential locales

    【讨论】:

    • 嗨@wmorrell,感谢您的反馈!如果没有VOLUME 声明,我每次更改应用程序时都需要重建或重新启动容器。这就是我使用它的原因。但无论如何,我尝试删除它并运行docker run -p 5000:5000 flask-app(没有-v)和热重载也不起作用。
    • @RodrigoDemetrio 这不是 Dockerfile 中的 VOLUME 的工作方式。设置 VOLUME 使该路径可用于从容器中 导出,并与 docker run--volumes-from 参数一起使用。如果要热重载代码,请从 Dockerfile 中删除 VOLUME 声明,然后使用 -v/--volume 标志到 docker run
    • 嗨@wmorrell,试过了,仍然出现 FileNotFoundError 错误
    猜你喜欢
    • 2019-10-31
    • 2017-08-09
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    相关资源
    最近更新 更多