Colin is daily life record

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

使用docker实现部署热更新

我们在使用docker 部署 的时候

遇到了一个非常严谨的问题

就是在项目更新的时候 总是需要重新build

这样的话,浪费的大量的资源和时间,如何才能节省时间&资源进行优化处理

而发现使用docker 热更新可以解决这一个问题

其要点就是将本地的项目与容器内的项目进行共享

这里我就使用flask来演示一下如何实现热更新

首先将项目放到github中

然后在服务器内使用git clone 将源项目克隆到服务器本地

这里我使用gunicon 来代理flask的启动方式

gunicorn可以结合gevent来进行部署,因此在高并发场景下也可适用,于是决定采用gunicorn进行部署。 gunicorn和supervisor会有一定的冲突,即使gunicorn中没有设置为后台启动,supervisor也只会管理gunicorn的master进程; supervisor的重启服务对于无响应的Flask进程来说并不生效,不能很好地解决我的服务由于某些原因无法正常响应但又找不到方法解决的问题,因此暂时决定不用supervisor。

gunicorn 配置 如下:

workers = 1 # 根据核心数
worker_class = "gevent" # 使用协程启动
bind = "0.0.0.0:5000"
reload = True # debug 模式开启

Dockerfile 配置如下:

FROM python:3.6
WORKDIR /Project/flask_project # 容器内项目位置
COPY requirements.txt ./
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
COPY . .
ENV LANG C.UTF-8
CMD ["gunicorn", "manage:app", "-c", "./gunicorn.conf.py"]

随后使用docker build 命令来生成 镜像包

docker build -t 'flask_project' .
查看 docker 镜像
[root@VM-0-12-centos flask_project]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
flask_project latest 9c9a85db3f84 37 minutes ago 986 MB
myvue latest 17537a1a2f41 23 hours ago 139 MB
docker.io/nginx latest 0901fa9da894 12 days ago 132 MB
docker.io/mongo latest 6d11486a97a7 2 weeks ago 388 MB
docker.io/python 3.6 e0373ff33a19 3 weeks ago 914 MB
最后使用 docker -v 命令挂载执行

docker run -p 5000:5000 -v /root/project/flask_project:/Project/flask_project flask_project
/root/project/flask_project 左边是服务器本机项目的位置

/Project/flask_project 右边是容器中项目的位置

该方法就是 将服务器内的项目与 容器内的项目进行共享

当项目发生更改 容器内也会更改

测试一下

vim manage.py

from app import *
import user_view
import get_order
import add_order
import nummber_register
app.register_blueprint(user_view.user)
app.register_blueprint(get_order.orders)
app.register_blueprint(add_order.order)
app.register_blueprint(nummber_register.number)
@app.route('/',methods=['GET','POST'])
def index():
return '123456' # 这里加一个6
# /get_file/61b7dbb7-6d69-4a0f-81c6-a1a2f05110c3.png
# 展示本地图片路由
@app.route('/get_file/<file_name>', methods=['GET'])
def get_file(file_name):
try:
response = make_response(
send_from_directory('./static/', file_name, as_attachment=True))
return response
except Exception as e:
return f"文件读取异常{e}"
if __name__ == '__main__':
app.run(debug=True, host="0.0.0.0", port=5000)

posted on   酷酷的瑞瑞  阅读(280)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示