Docker绑定挂载修改Flask代码后API不生效,需重启容器排查
问题描述
- 场景:Flask应用通过Docker绑定挂载部署,修改本地
src/app.py文件后,容器内对应文件已同步更新,但Postman调用API无法看到修改效果,必须重启容器才生效。 - 容器启动命令:
docker run -p 9000:5000 --mount type=bind,source="$(pwd)"/src/,target=/src/ voting-app:latest - Dockerfile内容:
FROM python:3.8.10-alpine COPY requirements.txt requirements.txt RUN pip install -r requirements.txt COPY ./src ./src WORKDIR ./src ENTRYPOINT ["python"] CMD ["app.py"] - 已排查:容器内
app.py文件确实同步了修改,目录挂载无inode异常,使用Docker版本为20.10.17。
解决方案
核心原因是Flask默认未启用开发模式的自动重载机制,即便文件内容更新,运行中的Flask进程也不会自动加载新代码,需手动触发重启。以下两种方法可解决:
方法一:通过环境变量开启自动重载
无需修改Dockerfile,启动容器时注入FLASK_ENV=development环境变量,Flask会自动开启文件变化检测与重载:
docker run -p 9000:5000 -e FLASK_ENV=development --mount type=bind,source="$(pwd)"/src/,target=/src/ voting-app:latest
也可以把环境变量写入Dockerfile,避免每次启动都添加参数:
在Dockerfile的WORKDIR ./src后添加:
ENV FLASK_ENV=development
重新构建镜像后启动即可。
方法二:改用flask run命令启动
修改Dockerfile,使用flask run命令并显式开启重载,同时配置必要环境变量:
FROM python:3.8.10-alpine COPY requirements.txt requirements.txt RUN pip install -r requirements.txt COPY ./src ./src WORKDIR ./src ENV FLASK_APP=app.py ENV FLASK_ENV=development ENTRYPOINT ["flask"] CMD ["run", "--host=0.0.0.0", "--port=5000", "--reload"]
重新构建镜像后启动容器,后续修改本地app.py,Flask会自动重启加载新代码。
注意事项
- 上述方案仅适用于开发场景,生产环境禁止使用
FLASK_ENV=development,建议采用Gunicorn、uWSGI等专业WSGI服务器部署,此时代码变更需手动重启服务。 - 绑定挂载的目录可正常触发Flask的文件变化通知,无需额外配置文件系统监听。
内容的提问来源于stack exchange,提问作者Hari K
相关产品推荐
相关产品推荐

