目录
一、方法一:通过正常方法(low)
二、通过脚本的方式进行项目部署
三、通过docker部署(完美的办法)
一、方法一:通过正常方法(low)
1、生成requirements文件,即项目依赖的包
# cd 到项目目录下
pip freeze >requirements.txt
2、创建虚拟环境
python -m venv venv(这个是虚拟环境名称)
3、激活虚拟环境
# 进入venv虚拟环境下的bin目录,执行
source activate
4、上传项目到服务器(复制,git pull/clone都可以)
5、导入项目所需依赖包
# 进入项目目录,执行
pip install -r requirements.txt
6、添加本地项目到环境变量
export PYTHONPATH=$PYTHONPATH:{project_dir}
# 也可在程序代码中使用sys.path.append()进行追加
7、进入项目下执行main.py等主程序
二、通过脚本的方式进行项目部署
#### 首先创建虚拟环境
pip install virtualenv
virtualenv venv
source venv/bin/activate
pip install -r requirements
后续写的脚本文件中的python路径为:
venv/bin/python的绝对路径
1、编写脚本文件
示例:
vim entity_extract.sh
#!/usr/bin/env bash
# 第一行是说明使用的什么脚本语言,这里是 bash, 固定用法
# workdir 是一个路径,即先切换到这个目录下,然后启动服务 (启动命令: python app.py)。其实不切换应该也可以
workdir=/Users/llm/PycharmProjects/solar-clover-backend
# 启动函数,切换路径=》其实就是 python app.py 。 前面一段指明是哪个路径下的python, 后面是 app.py 的路径, & 表示以后台方式启动(这里还不是很了解)
daemon_start() {
cd $workdir
/Users/llm/env_workspaces/flask/bin/python /Users/llm/PycharmProjects/solar-clover-backend/app.py &
echo "Server started."
}
# 停止函数,思路就是我们要找到这个进程号,然后把它 kill 掉
# 进程号寻找: 即 ps -ef|grep 命令, grep 用来过滤,awk 用来将过滤结果进行整理。 像这个命令,过滤出来有很多列,但我们只要进程号那一列,所以就是 {print $2}, 表示进程号那一列
# BEGIN{ ORS="," } 表示以逗号分隔每个进程号, 不写默认换行符分隔。
# 输出其实是一个字符串, 把它变为数组,因为我要取出第一个将进程杀死。 arr=... 这句话就是将 pid 变量里的内容转换为数组,存入arr。
# 接下来就是取到 arr 第一个进程号, 使用 kill 命令杀死
daemon_stop() {
pid=`ps -ef | grep 'python /Users/llm/PycharmProjects/solar-clover-backend/app.py' | awk 'BEGIN{ ORS="," }{ print $2 }'`
arr=(`echo ${pid} | tr ',' ' '`)
echo ${arr[1]}
kill ${arr[1]}
sleep 3
echo "Server killed."
}
# $1 表示命令行交互输入的第一个参数。 我们使用 ./dev.sh start 来运行脚本启动服务(因为此脚本文件名称为 dev.sh), start 位置上的变量就是传入的第一个位置上的参数,也可以变为 stop, restart
case "$1" in
start)
daemon_start
;;
stop)
daemon_stop
;;
restart)
daemon_stop
daemon_start
;;
*)
echo "Usage: ./dev.sh {start|stop|restart}"
exit 1
esac
exit 0
2、接下来的流程:
测试启动,停止,重启
./entity_extract.sh start 开启服务
./entity_extract.sh stop 停止服务
./entity_extract.sh restart 重启服务
放到系统服务器清单内
cp entity_extract.sh /etc/init.d # 将脚本复制到init.d,这个目录里面放系统服务脚本文件
chkconfig --add entity_extract.sh # 将davids.sh添加到系统服务清单内
chkconfig --list #查看davids.sh是否在系统服务清单内
重启服务器,查看Python脚本是否随系统启动而启动
重点:
*****上述办法不能用
参考:https://blog.csdn.net/qq_42393859/article/details/88170761
参考2:https://zhidao.baidu.com/question/1958799616349768340.html
或者直接这样操作:
# 服务器开机启动设置
sudo cp fw_service.sh /etc/init.d/ # 拷贝脚本到启动目录下
cd /etc/init.d/ # 进入启动目录
sudo update-rc.d fw_service.sh defaults 90 # 设置启动等级
# 注:
1、其中的90表示启动顺序,取值范围是0-99。序号越大的越晚执行。
3、报错解决
1、执行过程中出现/bin/bash^M: 坏的解释器:没有那个文件或目录错误,无法正常运行。这是因为windows和linux中的换行不一样
sed -i 's/\r$//' startup.sh
2、如果没有权限
chmod +x davids.sh
三、通过docker部署(完美的办法)
1、编写Dockerfile文件
在与项目目录同级的目录下,新建Dockerfile文件
vi Dockerfile
2、编辑Dockerfile,最好手打,最后保存退出
#基于的基础镜像
FROM python:3.6
#代码添加到code文件夹
ADD ./test /code
# 设置code文件夹是工作目录
WORKDIR /code
# 安装支持
RUN pip install flask -i https://pypi.douban.com/simple/
CMD ["python", "/code/main.py"]
3、在Dockerfile同级目录, build该Dockerfile
# 镜像名为:flask_entity_extract
docker build -t flask_entity_extract .
出现
Successfully built a69e5b09b454 #镜像id
Successfully tagged flask_entity_extract :latest #镜像名字
即为成功
查看:
docker images
4、通过创建的镜像创建容器,同时开启端口映射
docker run -it -p 9000:9000 --name flask_entity_extract_server flask_entity_extract
# it:创建并进入; -p 端口映射; --name 容器名; 最后面的是镜像名
5、此时flask服务已经启动,其他的docker操作如下:
一、安装
地址:https://docs.docker.com/install/linux/docker-ce/ubuntu/
卸载:$ sudo apt-get remove docker docker-engine docker.io containerd runc
更新apt:
$ sudo apt-get update # 公司服务器一般别搞
$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo apt-key fingerprint 0EBFCD88
$ sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
# 安装docker ce
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
# 查看版本
docker version
# 卸载当前版本
sudo yum remove docker-ce
sudo rm -rf /var/lib/docker
systemctl start docker # 启动docker
systemctl stop docker # 停止docker
systemctl restart docker # 重启docker
systemctl status docker # 装态docker
systemctl enable docker # 开机启动docker
docker info # 查看docker信息
docker --help # docker命令
docker images # 列出所有的镜像
docker search centos # 查询镜像
docker pull hello-world # 默认从docker hub下载镜像
docker rmi 镜像id/镜像名:标签名
docker rmi 'docker images -q' # 删除所有的docker镜像
docker rmi 'docker images -qa' # 删除所有的docker镜像
docker ps # 查看启动的容器
docker ps -a # 查看所有容器
docker ps -f status=exited # 查看停止的容器
# 通过镜像开启容器
容器名 镜像名 进入容器
docker run -it --name=mycentos centos:7 /bin/bash # 交互式容器的创建
docker run -id --name=mycentos1 centos:7
docker exec -it mycentos1 /bin/bash
exit # 关闭容器并退出
ctr+p+q # 退出容器,不关闭
docker start 容器名/容器id # 启动容器
docker stop 容器名/容器id # 停止容器
docker restart 容器名/容器id # 重启容器
docker attach 容器名/容器id # 进入容器
docker rm 容器名/容器id # 删除容器,前提是该容器处于关闭状态
docker rm -f $(docker ps -q) # 强制(-f)删除所有
# 目录挂载 -v
docker run -it --name=a3 -v home/docker_data/gaofei_data:/tmp tfgpu1.13.1-ubuntu16.04-cuda10.0-v1.0:latest /bin/bash # 如果报错,执行下面命令
docker run -it --name=a3 -v home/docker_data/gaofei_data:/tmp tfgpu1.13.1-ubuntu16.04-cuda10.0-v1.0:latest /bin/bash --privileged=true
docker cp 宿主机文件路径 容器名:容器路径
docker cp 容器名:容器路径 宿主机文件路径
注意:容器之间不可以拷贝
# 查看容器详细信息
docker inspect 容器名/容器id
查看挂载:docker inspect 容器名/容器id | grep Mounts -A 100
# 备份和迁移
docker commit 容器名 保存的镜像名
# 将镜像转换为压缩文件导出
docker save -o 输出的压缩文件名(.tar) 镜像名
# 通过压缩文件恢复镜像
docker rmi 镜像名
docker load -i 压缩文件名
docker images 查看镜像名
# 继承容器
docker run -it --name 容器2名称 --volumes-from 容器1名称 镜像名
新建容器 继承自 被继承容 镜像的名称
参考:
web项目部署:http://www.jiaochengku.net/ITjiaocheng/ruanjianbiancheng/12805.html
python项目部署(全):https://www.lanshiqin.com/d8d0505b/