在 Docker 上自动重新加载烧瓶服务器

Posted

技术标签:

【中文标题】在 Docker 上自动重新加载烧瓶服务器【英文标题】:Auto reloading flask server on Docker 【发布时间】:2017-11-04 16:19:47 【问题描述】:

我希望我的烧瓶服务器检测代码更改并自动重新加载。 我在 docker 容器上运行它。 每当我更改某些内容时,我都必须重新构建和构建容器。我不知道哪里出了问题。这是我第一次使用烧瓶。

这是我的树

├── docker-compose.yml
└── web
    ├── Dockerfile
    ├── app.py
    ├── crawler.py
    └── requirements.txt

和代码(app.py)

from flask import Flask 
import requests
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello Flask!!'

if __name__ == '__main__':
    app.run(debug = True, host = '0.0.0.0')

和 docker-compose

version: '2'
services:

  web:
    build: ./web
    ports:
     - "5000:5000"
    volumes:
     - ./web:/code

请给我一些建议。提前谢谢你。

【问题讨论】:

我相信你需要做的是更密切地关注github上的this thread。而且你从来没有把你的命令放在你如何运行你的 docker 请把你的 docker-compose 贴出来,我会调整它 @Robert 我添加了它。请调查一下并帮助我。 @James,下面的回答对你有帮助吗? @Robert,幸运的是,是的。问题是'./web:/code'。我将其更改为 './web:/abb' 并且可以正常工作。但不知道为什么... 【参考方案1】:

这是我的例子:

version: "3.8"

services:
  local-development:
    build:
      context: .
      dockerfile: Dockerfiles/development.Dockerfile
    ports:
      - "5000:5000"
    volumes:
      - .:/code
from flask import Flask

app = Flask(__name__)


@app.route('/')
def hello_world():
    return "hello world"


if __name__ in "__main__":
    app.run(host="0.0.0.0", port=5000, debug=True)

debug=True 使 Flask 能够随着您的代码更改而更改。

Docker 已经插入您的 fs 事件以更改“容器中”的代码。

【讨论】:

这没有显示您的文件结构,因此信息不足。【参考方案2】:

假设你的文件结构如下:

Dockerfile:(注意工作目录)

FROM python:3.6.5-slim
RUN mkdir -p /home/project/bottle
WORKDIR /home/project/bottle 
COPY requirements.txt .
RUN pip install --upgrade pip --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "app.py"]

Docker 编写:

version: '3'

services:
  web:
    container_name: web
    volumes:
      - './web:/home/project/bottle/'  <== Local Folder:WORKDIR
    build: ./web
    ports:
      - "8080:8080"

【讨论】:

感谢这对我有帮助。这个技巧是确保您将本地代码文件夹安装到您在 Dockerfile 中设置的 WORKDIR。对我来说,那是WORKDIR=/home/app,所以在 docker-compose 文件的卷下,我需要像这样安装:``- ./app:/home/app`【参考方案3】:

我设法使用带有以下配置的 docker-compose 在 docker 中实现烧瓶自动重新加载:

version: "3"
services:
  web:
    build: ./web
    entrypoint:
      - flask
      - run
      - --host=0.0.0.0
    environment:
      FLASK_DEBUG: 1
      FLASK_APP: ./app.py
    ports: ['5000:5000']
    volumes: ['./web:/app']

您必须在docker compose文件中手动指定环境变量和入口点才能实现自动重新加载。

【讨论】:

完美了,现在我们终于可以摆脱 app.py 了: if name == 'main': app.run(debug = True,主机 = '0.0.0.0') 您仍然需要来自lepsch 的WORKDIR app COPY * /app/ 命令是否正确? 有点晚了,但没有 - 你不应该需要,因为 /app 现在是一个 mounted 卷。不需要复制文件 您能描述一下volumes: ['./web:/app'] 的工作原理吗?【参考方案4】:

正如您已经完成的那样,Flask 支持在调试模式下重新加载代码。问题是应用程序在容器上运行,这将它与您正在开发的真实源代码隔离开来。无论如何,您可以在运行的容器和主机之间共享源代码,并使用 docker-compose.yaml 上的卷,如下所示:

这里是docker-compose.yaml

version: "3"
services:
  web:
    build: ./web
    ports: ['5000:5000']
    volumes: ['./web:/app']

这里是Dockerfile

FROM python:alpine

EXPOSE 5000

WORKDIR app

COPY * /app/

RUN pip install -r requirements.txt

CMD python app.py

【讨论】:

你能解释一下这些卷,为什么命名是你提供的? @MattSom,卷是您要从机器绑定到容器本身的文件夹。 IE。本地文件夹将存在于容器内。如果您遵循 OP 问题并查看文件树结构,源代码位于名为 web 的文件夹中。然后volumes 只是将这个文件夹共享到容器内一个名为app 的新文件夹中。顺便说一句,app 因为在Dockerfile 中默认WORKDIRapp 并且所有内容也被复制到/app/(docker-compose 中的volumes 将优先于复制的文件)。 COPY * /app/ 保留在Dockerfile 中很好,因此Dockerfile 与docker-compose 分开是独立的。 非常感谢您的精彩解释,您应该将其添加到答案中。也感谢Copy * /app/ 的评论。我有一个反应应用程序并使用了Copy . .,但热重新加载不想工作。我疯了好几天,但有了这个就可以了! @MáximaAlekz 只是为了使 Dockerfile 独立。 IE。你可以手动 docker build...docker run... 它,它仍然可以在没有 docker-compose 的情况下工作

以上是关于在 Docker 上自动重新加载烧瓶服务器的主要内容,如果未能解决你的问题,请参考以下文章

烧瓶自动重新加载不刷新浏览器

在烧瓶中提交后重新加载表单

如何在烧瓶中重新加载python模块?

Angular observable 没有从烧瓶服务器捕获新值

如何使用spring dev工具在docker中自动重新加载spring boot应用程序

如何使用 slack/grafana 或任何其他自动化方式重新启动 docker 容器?