目錄
一、方法一:通過正常方法(low)
二、通過腳本的方式進(jìn)行項(xiàng)目部署
三、通過docker部署(完美的辦法)
一、方法一:通過正常方法(low)
1、生成requirements文件,即項(xiàng)目依賴的包
# cd 到項(xiàng)目目錄下
pip freeze >requirements.txt
2、創(chuàng)建虛擬環(huán)境
python -m venv venv(這個(gè)是虛擬環(huán)境名稱)
3、激活虛擬環(huán)境
# 進(jìn)入venv虛擬環(huán)境下的bin目錄,執(zhí)行
source activate
4、上傳項(xiàng)目到服務(wù)器(復(fù)制,git pull/clone都可以)
5、導(dǎo)入項(xiàng)目所需依賴包
# 進(jìn)入項(xiàng)目目錄,執(zhí)行
pip install -r requirements.txt
6、添加本地項(xiàng)目到環(huán)境變量
export PYTHONPATH=$PYTHONPATH:{project_dir}
# 也可在程序代碼中使用sys.path.append()進(jìn)行追加
7、進(jìn)入項(xiàng)目下執(zhí)行main.py等主程序
二、通過腳本的方式進(jìn)行項(xiàng)目部署
#### 首先創(chuàng)建虛擬環(huán)境
pip install virtualenv
virtualenv venv
source venv/bin/activate
pip install -r requirements
后續(xù)寫的腳本文件中的python路徑為:
venv/bin/python的絕對路徑
?
1、編寫腳本文件
示例:
vim?entity_extract.sh
#!/usr/bin/env bash
# 第一行是說明使用的什么腳本語言,這里是 bash, 固定用法
# workdir 是一個(gè)路徑,即先切換到這個(gè)目錄下,然后啟動(dòng)服務(wù) (啟動(dòng)命令: python app.py)。其實(shí)不切換應(yīng)該也可以
workdir=/Users/llm/PycharmProjects/solar-clover-backend
# 啟動(dòng)函數(shù),切換路徑=》其實(shí)就是 python app.py 。 前面一段指明是哪個(gè)路徑下的python, 后面是 app.py 的路徑, & 表示以后臺(tái)方式啟動(dòng)(這里還不是很了解)
daemon_start() {
cd $workdir
/Users/llm/env_workspaces/flask/bin/python /Users/llm/PycharmProjects/solar-clover-backend/app.py &
echo "Server started."
}
# 停止函數(shù),思路就是我們要找到這個(gè)進(jìn)程號,然后把它 kill 掉
# 進(jìn)程號尋找: 即 ps -ef|grep 命令, grep 用來過濾,awk 用來將過濾結(jié)果進(jìn)行整理。 像這個(gè)命令,過濾出來有很多列,但我們只要進(jìn)程號那一列,所以就是 {print $2}, 表示進(jìn)程號那一列
# BEGIN{ ORS="," } 表示以逗號分隔每個(gè)進(jìn)程號, 不寫默認(rèn)換行符分隔。
# 輸出其實(shí)是一個(gè)字符串, 把它變?yōu)閿?shù)組,因?yàn)槲乙〕龅谝粋€(gè)將進(jìn)程殺死。 arr=... 這句話就是將 pid 變量里的內(nèi)容轉(zhuǎn)換為數(shù)組,存入arr。
# 接下來就是取到 arr 第一個(gè)進(jìn)程號, 使用 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 表示命令行交互輸入的第一個(gè)參數(shù)。 我們使用 ./dev.sh start 來運(yùn)行腳本啟動(dòng)服務(wù)(因?yàn)榇四_本文件名稱為 dev.sh), start 位置上的變量就是傳入的第一個(gè)位置上的參數(shù),也可以變?yōu)?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、接下來的流程:
測試啟動(dòng),停止,重啟
./entity_extract.sh start 開啟服務(wù)
./entity_extract.sh stop 停止服務(wù)
./entity_extract.sh restart 重啟服務(wù)
?放到系統(tǒng)服務(wù)器清單內(nèi)
cp entity_extract.sh /etc/init.d # 將腳本復(fù)制到init.d,這個(gè)目錄里面放系統(tǒng)服務(wù)腳本文件
chkconfig --add entity_extract.sh # 將davids.sh添加到系統(tǒng)服務(wù)清單內(nèi)
chkconfig --list #查看davids.sh是否在系統(tǒng)服務(wù)清單內(nèi)
重啟服務(wù)器,查看Python腳本是否隨系統(tǒng)啟動(dòng)而啟動(dòng)
重點(diǎn):
*****上述辦法不能用
參考:https://blog.csdn.net/qq_42393859/article/details/88170761
參考2:https://zhidao.baidu.com/question/1958799616349768340.html
或者直接這樣操作:
# 服務(wù)器開機(jī)啟動(dòng)設(shè)置
sudo cp fw_service.sh /etc/init.d/ # 拷貝腳本到啟動(dòng)目錄下
cd /etc/init.d/ # 進(jìn)入啟動(dòng)目錄
sudo update-rc.d fw_service.sh defaults 90 # 設(shè)置啟動(dòng)等級
# 注:
1、其中的90表示啟動(dòng)順序,取值范圍是0-99。序號越大的越晚執(zhí)行。
3、報(bào)錯(cuò)解決
1、執(zhí)行過程中出現(xiàn)/bin/bash^M: 壞的解釋器:沒有那個(gè)文件或目錄錯(cuò)誤,無法正常運(yùn)行。這是因?yàn)閣indows和linux中的換行不一樣
sed -i 's/\r$//' startup.sh
2、如果沒有權(quán)限
chmod +x davids.sh
三、通過docker部署(完美的辦法)
1、編寫Dockerfile文件
在與項(xiàng)目目錄同級的目錄下,新建Dockerfile文件
vi Dockerfile
2、編輯Dockerfile,最好手打,最后保存退出
#基于的基礎(chǔ)鏡像
FROM python:3.6
#代碼添加到code文件夾
ADD ./test /code
# 設(shè)置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 .
出現(xiàn)
Successfully built a69e5b09b454 #鏡像id
Successfully tagged flask_entity_extract?:latest #鏡像名字
即為成功
查看:
docker images
4、通過創(chuàng)建的鏡像創(chuàng)建容器,同時(shí)開啟端口映射
docker run -it -p 9000:9000 --name flask_entity_extract_server flask_entity_extract
# it:創(chuàng)建并進(jìn)入; -p 端口映射; --name 容器名; 最后面的是鏡像名
5、此時(shí)flask服務(wù)已經(jīng)啟動(dòng),其他的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 # 公司服務(wù)器一般別搞
$ 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
# 卸載當(dāng)前版本
sudo yum remove docker-ce
sudo rm -rf /var/lib/docker
systemctl start docker # 啟動(dòng)docker
systemctl stop docker # 停止docker
systemctl restart docker # 重啟docker
systemctl status docker # 裝態(tài)docker
systemctl enable docker # 開機(jī)啟動(dòng)docker
docker info # 查看docker信息
docker --help # docker命令
docker images # 列出所有的鏡像
docker search centos # 查詢鏡像
docker pull hello-world # 默認(rèn)從docker hub下載鏡像
docker rmi 鏡像id/鏡像名:標(biāo)簽名
docker rmi 'docker images -q' # 刪除所有的docker鏡像
docker rmi 'docker images -qa' # 刪除所有的docker鏡像
docker ps # 查看啟動(dòng)的容器
docker ps -a # 查看所有容器
docker ps -f status=exited # 查看停止的容器
# 通過鏡像開啟容器
容器名 鏡像名 進(jìn)入容器
docker run -it --name=mycentos centos:7 /bin/bash # 交互式容器的創(chuàng)建
docker run -id --name=mycentos1 centos:7
docker exec -it mycentos1 /bin/bash
exit # 關(guān)閉容器并退出
ctr+p+q # 退出容器,不關(guān)閉
docker start 容器名/容器id # 啟動(dòng)容器
docker stop 容器名/容器id # 停止容器
docker restart 容器名/容器id # 重啟容器
docker attach 容器名/容器id # 進(jìn)入容器
docker rm 容器名/容器id # 刪除容器,前提是該容器處于關(guān)閉狀態(tài)
docker rm -f $(docker ps -q) # 強(qiáng)制(-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 # 如果報(bào)錯(cuò),執(zhí)行下面命令
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 宿主機(jī)文件路徑 容器名:容器路徑
docker cp 容器名:容器路徑 宿主機(jī)文件路徑
注意:容器之間不可以拷貝
# 查看容器詳細(xì)信息
docker inspect 容器名/容器id
查看掛載:docker inspect 容器名/容器id | grep Mounts -A 100
# 備份和遷移
docker commit 容器名 保存的鏡像名
# 將鏡像轉(zhuǎn)換為壓縮文件導(dǎo)出
docker save -o 輸出的壓縮文件名(.tar) 鏡像名
# 通過壓縮文件恢復(fù)鏡像
docker rmi 鏡像名
docker load -i 壓縮文件名
docker images 查看鏡像名
# 繼承容器
docker run -it --name 容器2名稱 --volumes-from 容器1名稱 鏡像名
新建容器 繼承自 被繼承容 鏡像的名稱
?
?
?
參考:
web項(xiàng)目部署:http://www.jiaochengku.net/ITjiaocheng/ruanjianbiancheng/12805.html
python項(xiàng)目部署(全):https://www.lanshiqin.com/d8d0505b/
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
