在Docker上自动重装flask服务器

Big*_*mes 12 python flask docker

我希望我的烧瓶服务器检测代码中的更改并自动重新加载.我在docker容器上运行它.每当我改变一些东西时,我都必须再次建造容器.我不知道哪里错了.这是我第一次使用烧瓶.

这是我的树

??? docker-compose.yml
??? web
    ??? Dockerfile
    ??? app.py
    ??? crawler.py
    ??? requirements.txt
Run Code Online (Sandbox Code Playgroud)

和代码(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')
Run Code Online (Sandbox Code Playgroud)

和docker-compose

version: '2'
services:

  web:
    build: ./web
    ports:
     - "5000:5000"
    volumes:
     - ./web:/code
Run Code Online (Sandbox Code Playgroud)

请给我一些建议.先感谢您.

lep*_*sch 14

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

这里是 docker-compose.yaml

version: "3"
services:
  web:
    build: ./web
    ports: ['5000:5000']
    volumes: ['./web:/app']
Run Code Online (Sandbox Code Playgroud)

在这里Dockerfile:

FROM python:alpine

EXPOSE 5000

WORKDIR app

COPY * /app/

RUN pip install -r requirements.txt

CMD python app.py
Run Code Online (Sandbox Code Playgroud)

  • 您能否解释一下这些卷,为什么命名是您提供的? (2认同)
  • @MattSom,卷是您要从计算机绑定到容器本身的文件夹。即本地文件夹将存在于容器内。如果您遵循OP问题并查看文件树结构,源代码位于名为“web”的文件夹内。然后,“volumes”只是将该文件夹共享到容器内名为“app”的新文件夹中。顺便说一句,“app”,因为在“Dockerfile”中,默认的“WORKDIR”是“app”,并且所有内容都被复制到“/app/”(docker-compose 中的“volumes”将优先于复制的文件) 。 (2认同)

小智 9

我设法使用docker-compose在docker中使用以下配置实现flask自动重载:

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']
Run Code Online (Sandbox Code Playgroud)

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


eri*_*cgu 5

假设您的文件结构如下:

在此处输入图片说明

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"]
Run Code Online (Sandbox Code Playgroud)

Docker 组合:

version: '3'

services:
  web:
    container_name: web
    volumes:
      - './web:/home/project/bottle/'  <== Local Folder:WORKDIR
    build: ./web
    ports:
      - "8080:8080"
Run Code Online (Sandbox Code Playgroud)

  • 谢谢这对我有帮助。这个技巧是确保将本地代码文件夹挂载到您在 Dockerfile 中设置的 WORKDIR。对我来说,这是“WORKDIR=/home/app”,因此在 docker-compose 文件中的卷下,我需要像这样安装:“- ./app:/home/app” (2认同)