我正在为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设置为开发。首次启动该应用程序时,我的所有更改均正确显示:
如果我进行了非常简单的编辑,例如,通过外观更改来更改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。