中文字幕一区二区人妻电影,亚洲av无码一区二区乱子伦as ,亚洲精品无码永久在线观看,亚洲成aⅴ人片久青草影院按摩,亚洲黑人巨大videos

使用Docker簡(jiǎn)化離線Python部署

發(fā)布于:2021-01-20 11:27:02

0

1018

0

devops docker python

如果生產(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é)尾,您將能夠……

  1. 描述Python wheels和egg之間的區(qū)別

  2. 說明為什么您可能要在Docker容器中構(gòu)建Python wheel文件

  3. 啟動(dòng)自定義環(huán)境以使用Docker構(gòu)建Python wheels

  4. 將Python項(xiàng)目捆綁并部署到無需訪問Internet的環(huán)境

  5. 解釋如何將該部署設(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)了新部署的問題,您可以輕松回滾。