最近公司 iOS 项目需求暂时放缓,于是公司说让我学一下Python一个股票回测,预警的功能,于是兴匆匆的去百度学习Python然后开发ing

但是开发结束项目需要部署服务器,于是开始了我的部署之路

初级部署

项目写好了,因为对于Django也会的不多,就直接按照文档上的部署命令去部署项目

nohup python3 -u manage.py runserver 0.0.0.0:8010

但是这样部署会出现一个问题就是服务器运行两个进程,于是做了一些修改

nohup python3 -u manage.py runserver 0.0.0.0:8010 --noreload

这样部署了,项目也正常运行了,但是后续继续开发的时候出现了一些bug,但是因为没有日志文件,对于bug排查很费劲,于是又去各种搜索,各种百度,于是新加了日志文件

python3 -u manage.py runserver 0.0.0.0:8010 --noreload > info_log.out 2>&1 &

中级部署

这样项目运行了一段时间,也正常运行没有问题,但是因为要经常重新部署项目,需要先去执行命令
ps aux |grep python
获取到正在运行pid然后kill -9 pid 再去重新执行运行命令,这样去运行项目很麻烦,而且当时犯了个致命错误获取项目pid时候,看错pid了,差点kill一个项目,于是我想着这样不行,要写个脚本才好,于是api_run.sh 文件诞生了

#!/bin/sh
APP_NAME=manage.py
APP_HOME=/pan/workspace/zfxf_py_data

stop(){
    pid=`cat pid.txt`
    pid=`cat pid.txt`
		if [ -n "$pid" ];then
			kill -9 $pid
			echo "killed $APP_NAME"
		fi
    # rm -rf $APP_HOME/zfxf-app.pid
    echo "$pid"
	  echo "$APP_NAME has been stopped"
}

deploy(){
	cd $APP_HOME
	stop
	if [ -n "$APP_NAME" ]; then
		mv $APP_NAME "$APP_NAME".bak
		echo "$APP_NAME"
	fi
	cp build/$APP_NAME ./
	sleep 2
	start
	ps -ef|grep $APP_NAME
}

start(){
    nohup python3 -u manage.py runserver 0.0.0.0:8010 --noreload > info_log.out 2>&1 & echo $! > pid.txt
	  # echo $! > $APP_HOME/zfxf-app.pid
		echo $!
	  echo "$APP_NAME has been started"
}

restart(){
	stop
	sleep 1
	start
}
case $1 in
  start)
    # check_env
    start
		exit 0
	  ;;
  stop)
    # check_env
    stop
		exit 0
    ;;
  restart)
    restart
		exit 0
    ;;
	deploy)
    deploy
		exit 0
    ;;
  *)
    echo "Usage: t1trade-push.sh {start|stop|restart}"
		exit 0
    ;;
esac

这样每次运行的时候执行start 命令,或者是restart命令,尽量避免出现人为的错误

最终部署

使用上面的部署方案运行一段时间测试没有问题这个时候需要部署到测试环境上,这时候出现了个问题,因为两台服务器的Python环境不一致,而且上面的一些Python 三方版本不一致,出现了大问题,于是在后台建议下说是弄成Docker 部署,于是又是各种搜索,各种查

Django项目使用Docker部署,先要创建Dockerfile文件

FROM python:3.10.6
MAINTAINER YuanJiaShuai
EXPOSE 8010
#设置环境变量
#ENV PROJECT_ENV test
ENV PYTHONUNBUFFERED 1
#设置pip源为国内源
#RUN pip3 install --upgrade pip -i  https://pypi.douban.com/simple/ --trusted-host pypi.douban.com
#RUN pip3 install --upgrade pip -i  https://mirrors.aliyun.com/pypi/simple/
#在容器内/var/www/html/下创建 PetHomeServer 文件夹p
RUN mkdir -p /pan/workspace/zfxf_py_data
#设置容器工作目录
WORKDIR /pan/workspace/zfxf_py_data
#将当前目录文件加入容器工作目录中(.表示当前宿主机目录)
ADD . /pan/workspace/zfxf_py_data
#利用pip安装依赖
RUN pip3 install -r requirements.txt -i https://pypi.douban.com/simple/ --trusted-host pypi.douban.com

#BUILD_TYPE='DOCKER'
ENTRYPOINT ["python3", "-u", "manage.py","runserver","0.0.0.0:8010", "--noreload"]

源于第二种部署的时候感觉到脚步的便捷性,于是对于Docker 部署也是用脚步执行,就创建build.sh 文件

#!/bin/sh

# 定义应用组名
group_name='com.zfxf.py'
# 定义应用名称
app_name='zfxf-py-app'
# 定义应用版本
app_version='1.0.0'
# 定义应用环境 本地开发环境test测试服务器开发环境dev,正式服务器开发环境pro 切换环境时,注意修改
PROJECT_ENV='pro'
# 日志位置
app_log='/pan/workspace/test/zfxf_py_data/logs'
port=8010
#echo '----set profile_active----'
#sed -i 's/<active-profile&gt;/$2/g' Dockerfile
echo '----copy jar----'
docker stop ${app_name}
echo '----stop container----'
docker rm ${app_name}
echo '----rm container----'
docker rmi ${group_name}/${app_name}:${app_version}
echo '----rm image----'
# 打包编译docker镜像
docker build -t ${group_name}/${app_name}:${app_version} .

echo '----build image----'

docker run -it 
  --name ${app_name} 
  --restart always 
  --net=host 
  --env "PROJECT_ENV=${PROJECT_ENV}" 
  -p 8010:8010 
  -v ${app_log}:/pan/workspace/zfxf_py_data/logs 
  -e TZ="Asia/Shanghai" 
  -v /etc/localtime:/etc/localtime 
  -d ${group_name}/${app_name}:${app_version}
echo '----start container----'

这样每次执行的时候就只需要sh build.sh可以部署完成了,即使是切换服务器也是懒人式执行,当然这个前提是服务器要已经部署过docker

—————

以上就是我这个新手对于Docker 部署Django 项目的全部实践路线,上面内容写的很简单,但是在实际开发中也遇到了很多问题,好在最后都一一解决,因为本人是独立开发,也算是属于闭门造车,如果有大佬更好方案,希望不吝赐教!

原文地址:https://blog.csdn.net/yjs_13597468160/article/details/128673214

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_40282.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注