[在Docker中使用Flask运行Flask会导致重新加载时出错

问题描述 投票:1回答:2

我正在为docker容器中的flask应用设置开发环境,在开发期间,我希望能够将Flask置于开发模式,以便在更改文件时可以实时重新加载。我正在使用卷,以便可以在docker之外编辑文件。我从Flask中获得了所需的行为,在编辑flask测试文件时,它检测到文件更改,但是,它似乎正在尝试提供中继文件而不是已编辑的文件,从而导致应用程序出错。

Dockerfile:

FROM python:3.8.1-alpine3.11
RUN apk update && apk upgrade && apk add bash

#Set ENV Variables
ENV FLASK_APP hello.py

#Add user.
RUN adduser -D eskimotv
USER eskimotv

#Set Work directory
WORKDIR /home/eskimotv

#Install Dependencies
COPY requirements requirements
RUN python -m venv venv
RUN venv/bin/pip install --upgrade pip
RUN venv/bin/pip install -r requirements/docker.txt

#Copy project files
COPY frontend frontend
COPY migrations migrations
COPY boot.sh ./

#Deploy Project
EXPOSE 5000
#ENTRYPOINT ["./boot.sh"]

Docker-compose.yml:

version: '3'
services:
  frontend:
    image: bentsea/eskimotv-frontend:latest
    build:
      dockerfile: frontend.dockerfile
      context: .
    ports:
      - "8000:5000"
    env_file: .env
    volumes:
      - './boot.sh:/home/eskimotv/boot.sh'
      - './hello.py:/home/eskimotv/hello.py'
      - './frontend:/home/eskimotv/frontend'
    #entrypoint: ./boot.sh
    restart: always

简单烧瓶应用程序,hello.py:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
    return '<h1>Hello World!</h1><p> Please work!</p>'

@app.route('/user/<name>')
def user(name):
    return '<h1>Hello, {}!</h1>'.format(name)

环境变量FLASK_ENV设置为开发。首次启动该应用程序时,我的所有更改均正确显示:

Working App Serving Correctly

如果我进行了非常简单的编辑,例如,通过外观更改来更改hello.py的第10行,例如:

return '<h1>Hello, {}, I made a small change to the text!</h1>'.format(name)

Flask将适当地重新加载:

 * Detected change in '/home/eskimotv/hello.py', reloading
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 234-654-899
172.21.0.1 - - [31/Dec/2019 20:00:20] "GET /user/David HTTP/1.1" 200 -
 * Detected change in '/home/eskimotv/hello.py', reloading
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 234-654-899

但是,页面将开始产生错误,而不是正确显示页面:

Example of error generated after file reloads.

有时只是EOL错误,它指示文件被截断,有时它指示此空错误。重新启动Flask服务器或撤消对文件的编辑都可以解决问题,并且该应用将正常运行。每次编辑时都要重新启动服务器,这是我要避免的操作。

没有人有什么想法会导致此卷配置中的文件无法正确加载,并且我可以采取什么措施解决该问题,以达到使重新加载在编辑文件时显示该文件的预期行为?

python docker flask alpine python-3.8
2个回答
0
投票

更改代码后尝试重新构建docker。进行更改之前,请执行

docker-compose stop

然后通过编辑行进行更改

return '<h1>Hello, {}, I made a small change to the text!</h1>'.format(name)

在上面进行更改后,现在做

docker-compose build

最后]

docker-compose up

0
投票

我不知道为什么会发生该错误,但是它似乎是由装入单个文件而不是目录引起的。通过重组我的应用程序以仅装载包括需要更新的文件的整个目录,我得以成功使用一种工作流,该工作流允许在文件更改时通过Docker自动重新加载Flask。

© www.soinside.com 2019 - 2024. All rights reserved.