目錄
一、方法一:通過正常方法(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/
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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