Python 在Docker中使用卷运行烧瓶会导致重新加载时出错

Python 在Docker中使用卷运行烧瓶会导致重新加载时出错,python,docker,flask,alpine,python-3.8,Python,Docker,Flask,Alpine,Python 3.8,我正在为docker容器中的flask应用程序设置开发环境,在开发过程中,我希望能够将flask置于开发模式,以便在更改文件时能够实时重新加载。我正在使用卷,以便在docker之外编辑文件。我从Flask获得了所需的行为,在编辑Flask测试文件时,它检测到文件更改,但是,它似乎试图提供集群文件,而不是已编辑的文件,从而导致应用程序出错 Dockerfile: FROM python:3.8.1-alpine3.11 RUN apk update && apk upgrade &

我正在为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)
但是,页面将开始产生错误,而不是正确显示页面:

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


是否有人知道是什么原因导致此卷配置中的文件加载不正确,以及我可以如何解决此问题,以获得重新加载在编辑文件时显示文件的预期行为

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

docker-compose stop
然后通过编辑该行进行更改

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

docker-compose up

我不知道为什么会发生这个错误,但是它似乎是由挂载单个文件而不是目录引起的。通过重新构造我的应用程序,只装载包含需要更新的文件的整个目录,我能够成功地使用一个工作流,允许在文件更改时通过Docker自动重新加载烧瓶


无论出于何种原因,Docker都无法准确更新装入的单个文件(如果这些文件位于装入的目录之外)。

尝试装入包含所有文件的文件夹,而不是装入卷部分中的每个单独文件。@salparade,这个变通方法对我很有效,它允许我主动地对项目进行更改,而无需重新启动容器来查看它们的影响。非常感谢。如果你这样做(我认为这是一个标准的DOCKER工作流),你可以删除<代码>卷:段在你的代码> DokCeopy.YML/COD>文件中,它隐藏了你的图像构建中的文件。我很欣赏这个建议,这是我目前必须做的,直到我找到一个解决方案,但是,这需要添加近一分钟的关机和启动时间,以查看我所做的每一项更改的影响。理想情况下,我需要一个解决方案,它允许我使用卷,并且不需要在每次更新项目时重新启动容器。
return '<h1>Hello, {}, I made a small change to the text!</h1>'.format(name)
docker-compose build
docker-compose up