运行 Docker 中的 Flask 使用卷导致重新加载时出错

Running Flask in Docker Using Volumes Causes Error on Reload

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

Docker文件:

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 设置为开发。第一次启动应用程序时,我的所有更改都正确显示:

如果我进行了非常简单的编辑,例如对 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

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

有时它只是一个EOL错误,表示文件被截断,有时它表示这个空错误。重新启动 Flask 服务器或撤消对文件所做的编辑可以解决问题,应用程序将正常运行。每次我进行编辑时重新启动服务器是我想要避免的操作。

有没有人知道什么会导致此卷配置中的文件加载不正确,以及我可以采取什么措施来解决该问题以获得让重新加载显示编辑后的文件的预期行为?

更改代码后尝试重建 docker。 在进行更改之前做

docker-compose stop

然后通过编辑行进行更改

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

完成上述更改后,现在执行

docker-compose build

最后

docker-compose up

我不知道为什么会出现错误,但它似乎是由挂载单个文件而不是目录引起的。通过重组我的应用程序以仅挂载包含需要更新的文件的整个目录,我能够成功地使用允许通过 Docker 在文件更改时自动重新加载 Flask 的工作流。

无论出于何种原因,Docker 无法准确更新已挂载的单个文件(如果它们位于挂载目录之外)。