發(fā)布于:2021-01-20 11:27:02
0
1018
0
如果生產(chǎn)服務(wù)器不能訪問Internet或內(nèi)部網(wǎng)絡(luò),則需要將Python依賴項(xiàng)(作為輪文件)和解釋器與源代碼捆綁在一起。
本文將介紹如何打包一個(gè)Python項(xiàng)目,以便在一臺(tái)使用Docker與Internet斷開連接的機(jī)器上進(jìn)行內(nèi)部分發(fā)。
目標(biāo)
在這篇文章的結(jié)尾,您將能夠……
描述Python wheels和egg之間的區(qū)別
說明為什么您可能要在Docker容器中構(gòu)建Python wheel文件
啟動(dòng)自定義環(huán)境以使用Docker構(gòu)建Python wheels
將Python項(xiàng)目捆綁并部署到無需訪問Internet的環(huán)境
解釋如何將該部署設(shè)置視為不變的
場(chǎng)景
這篇文章的起源來自一個(gè)場(chǎng)景,在這個(gè)場(chǎng)景中,由于安全原因,我不得不將一個(gè)遺留的Python 2.7 Flask應(yīng)用程序分發(fā)到一個(gè)Centos 5盒子中,而這個(gè)盒子無法訪問Internet。
Python wheels(而不是eggs)是這里的方法。
Python wheels文件與eggs類似,因?yàn)樗鼈兌际侵皇怯脕矸职l(fā)代碼的zip文件。wheels的不同之處在于它們是可安裝的,但不是可執(zhí)行的。它們也是預(yù)編譯的,這樣用戶就不用自己構(gòu)建包了;因此,加快了安裝過程??梢詫⑺鼈兛醋魇荘ython eggs的更輕的預(yù)編譯版本。它們特別適合于需要編譯的包,如lxml或NumPy。
這樣,wheels應(yīng)該建立在運(yùn)行它們的相同環(huán)境上,因此,使用多個(gè)版本的Python跨多個(gè)平臺(tái)構(gòu)建它們可能是一個(gè)巨大的難題。
這就是Docker發(fā)揮作用的地方。
Bundle
在開始之前,需要注意的是,我們將使用Docker簡(jiǎn)單地啟動(dòng)一個(gè)構(gòu)建wheels的環(huán)境。換句話說,我們將使用Docker作為構(gòu)建工具,而不是部署環(huán)境。
此外,請(qǐng)記住,此過程不僅適用于舊版應(yīng)用程序,還可用于任何Python應(yīng)用程序。
堆棧:
OS: Centos 5.11
Python version: 2.7
App: Flask
WSGI: gunicorn
Web server: Nginx
環(huán)境設(shè)置
我們將在本節(jié)中通過網(wǎng)絡(luò)下載和安裝依賴項(xiàng)。假設(shè)您通常不需要設(shè)置服務(wù)器本身;它應(yīng)該已經(jīng)預(yù)先配置好了。
由于控制盤是在Centos 5.11環(huán)境下構(gòu)建的,因此幾乎可以在任何Linux環(huán)境下工作。因此,如果您想繼續(xù),請(qǐng)使用最新版本的Centos啟動(dòng)一個(gè)Digital Ocean droplet。
SSH into the box,作為root用戶,在繼續(xù)本教程之前,請(qǐng)?zhí)砑影惭bPython所需的依賴項(xiàng):
$ yum -y install
gzipzlib
zlib-devel
gcc
openssl-devel
sqlite-devel
bzip2-devel
接下來,安裝并運(yùn)行Nginx:
$ yum -y install
epel-release
nginx
$ sudo /etc/init.d/nginx start
在瀏覽器中導(dǎo)航到服務(wù)器的IP地址。您應(yīng)該看到默認(rèn)的Nginx測(cè)試頁面。
接下來,更新/etc/Nginx/conf.d中的Nginx配置/默認(rèn).conf要重定向流量:
server {
listen 80;
listen [::]:80;
location / {
proxy_pass http://127.0.0.1:1337;
}
}
重新啟動(dòng)Nginx:
$ service nginx restart
現(xiàn)在您應(yīng)該在瀏覽器中看到502錯(cuò)誤。
在框中創(chuàng)建常規(guī)用戶:
$ useradd$ passwd
退出完成后的環(huán)境。
部署
要部署,首先通過tarball和安裝腳本手動(dòng)保護(hù)副本,setup.sh,到遠(yuǎn)程框:
$ scp app-v20180119.tar.gz@:/home/$ scp setup.sh@:/home/
快速查看安裝腳本:
#!/bin/bash
USAGE_STRING="USAGE: sh setup.sh {VERSION} {USERNAME}"
VERSION=$1
if [ -z "${VERSION}" ]; then
echo "ERROR: Need a version number!" >&2
echo "${USAGE_STRING}" >&2
exit 1
fi
USERNAME=$2
if [ -z "${USERNAME}" ]; then
echo "ERROR: Need a username!" >&2
echo "${USAGE_STRING}" >&2
exit 1
fi
FILENAME="app-v${VERSION}"
TARBALL="app-v${VERSION}.tar.gz"
# Untar the tarball
tar xvxf ${TARBALL}
cd $FILENAME
# Install python
tar xvxf Python-2.7.14.tar.xz
cd Python-2.7.14
./configure
--prefix=/home/$USERNAME/python2.7
--with-zlib-dir=/home/$USERNAME/lib
--enable-optimizations
echo "Running MAKE =================================="
make
echo "Running MAKE INSTALL ==================================="
make install
echo "cd USERNAME/FILENAME ==================================="
cd /home/$USERNAME/$FILENAME
# Install pip and virtualenv
echo "python get-pip.py ==================================="
/home/$USERNAME/python2.7/bin/python get-pip.py
echo "python -m pip install virtualenv ==================================="
/home/$USERNAME/python2.7/bin/python -m pip install virtualenv
# Create and activate a new virtualenv
echo "virtualenv venv ==================================="
/home/$USERNAME/python2.7/bin/virtualenv venv
echo "source activate ==================================="
source venv/bin/activate
# Install python dependencies
echo "install wheels ==================================="
pip install wheels/*
這應(yīng)該相當(dāng)簡(jiǎn)單:這個(gè)腳本只是設(shè)置一個(gè)新的Python環(huán)境和在新的虛擬環(huán)境中安裝依賴項(xiàng)。
將SSH放入框中并運(yùn)行安裝腳本:
$ ssh@$ sh setup.sh 20180119
這將需要幾分鐘。完成后,cd
進(jìn)入app目錄并激活虛擬環(huán)境:
$ cd app-v20180119
$ source venv/bin/activate
運(yùn)行測(cè)試:
$ python test.py
完成后,啟動(dòng)gunicorn作為守護(hù)程序:
$ gunicorn -D -b 0.0.0.0:1337 app:app
結(jié)論
在本文中,我們研究了如何打包一個(gè)帶有Docker和Pythonwheels的Python項(xiàng)目,以便在與Internet斷開的機(jī)器上部署。
通過這種設(shè)置,由于我們打包了代碼、依賴項(xiàng)和解釋器,我們的部署被認(rèn)為是不可變的。對(duì)于每個(gè)新部署,我們將啟動(dòng)一個(gè)新環(huán)境,并在關(guān)閉舊環(huán)境之前進(jìn)行測(cè)試以確保其正常工作。這將消除繼續(xù)在遺留代碼之上部署時(shí)可能出現(xiàn)的任何錯(cuò)誤或問題。另外,如果您發(fā)現(xiàn)了新部署的問題,您可以輕松回滾。
作者介紹
熱門博客推薦