在 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
中默认WORKDIR
是app
并且所有内容也被复制到/app/
(docker-compose 中的volumes
将优先于复制的文件)。
将COPY * /app/
保留在Dockerfile
中很好,因此Dockerfile
与docker-compose 分开是独立的。
非常感谢您的精彩解释,您应该将其添加到答案中。也感谢Copy * /app/
的评论。我有一个反应应用程序并使用了Copy . .
,但热重新加载不想工作。我疯了好几天,但有了这个就可以了!
@MáximaAlekz 只是为了使 Dockerfile
独立。 IE。你可以手动 docker build...
和 docker run...
它,它仍然可以在没有 docker-compose
的情况下工作以上是关于在 Docker 上自动重新加载烧瓶服务器的主要内容,如果未能解决你的问题,请参考以下文章
Angular observable 没有从烧瓶服务器捕获新值