閱讀496 返回首頁    go 阿裏雲 go 技術社區[雲棲]


python項目在無外網的生產環境解決沙盒依賴問題

python項目在無外網的生產環境解決沙盒依賴問題

在我們實際的生產項目部署過程中,比如銀行,政務內網,無法訪問某些依賴源。結合實際情況,我們看下如何解決這個問題。

開發環境

建立項目開發路徑

 mkdir -p /data/python/project/

我們先查看是否有pip命令工具
pip的命令行安裝看官網鏈接:
https://pip.pypa.io/en/stable/installing/

root@-dev:/data/python/project# whereis pip
pip: /usr/bin/pip /usr/local/bin/pip /usr/local/bin/pip2.7 /root/miniconda2/bin/pip /usr/share/man/man1/pip.1.gz
安裝開發所需的python virtualenv虛擬環境沙盒開發工具
pip install virtualenv #安裝
進入開發目錄
cd /data/python/project/
創建虛擬沙盒virtualenv
virtualenv venv

20170805115214

查看沙盒目錄

20170805135722

進入虛擬環境,我們通過進入這個沙盒環境,執行我們開發的項目代碼,從而避免汙染係統的python環境
root@dev:/data/python/project# source venv/bin/activate
(venv) root@dev:/data/python/project# 

看到 使用沙盒環境之後,命令行頭部都帶著一個沙盒目錄名稱[venv]

20170805140148

退出虛擬環境
 deactivate

20170805142034

查看虛擬python環境和係統python環境的差異
(venv) root@dev:/data/python/project# pwd
/data/python/project
(venv) root@dev:/data/python/project# which python
/data/python/project/venv/bin/python
(venv) root@dev:/data/python/project# python -V
Python 2.7.12
(venv) root@dev:/data/python/project# deactivate 
root@dev:/data/python/project# which python
/root/miniconda2/bin/python
root@dev:/data/python/project# python -V
Python 2.7.13 :: Continuum Analytics, Inc.
root@dev:/data/python/project# 

可以看到兩個python 路徑調用也好,版本也好,都是不一樣的

我們在虛擬python環境下安裝一些開發用的模塊,比如Flask
(venv) root@dev:/data/python/project# pip install Flask
Collecting Flask
  Using cached Flask-0.12.2-py2.py3-none-any.whl
Collecting itsdangerous>=0.21 (from Flask)
Collecting click>=2.0 (from Flask)
  Using cached click-6.7-py2.py3-none-any.whl
Collecting Werkzeug>=0.7 (from Flask)
  Using cached Werkzeug-0.12.2-py2.py3-none-any.whl
Collecting Jinja2>=2.4 (from Flask)
  Using cached Jinja2-2.9.6-py2.py3-none-any.whl
Collecting MarkupSafe>=0.23 (from Jinja2>=2.4->Flask)
Installing collected packages: itsdangerous, click, Werkzeug, MarkupSafe, Jinja2, Flask
Successfully installed Flask-0.12.2 Jinja2-2.9.6 MarkupSafe-1.0 Werkzeug-0.12.2 click-6.7 itsdangerous-0.24
(venv) root@dev:/data/python/project# 

在無外網環境移植這些所需的執行模塊,先是在虛擬沙盒環境下開發好代碼,然後打包部署。

我們將整個virtualenv環境相關的項目打包,生成一個有執行環境的完整項目包,解壓後使用,即上麵的開發項目目錄 /data/python/project整體打包壓縮。

使用virtualenv --relocatable 指令修改可變更位置的 ENV 執行環境。

實踐操作,
還是項目目錄 /data/python/project

cd /data/python/project

查看 執行 virtualenv --relocatable ./venv 之前的虛擬環境pip源碼

root@dev:/data/python/project# ll
total 12
drwxr-xr-x 3 root root 4096 8月   5 15:08 ./
drwxr-xr-x 3 root root 4096 8月   5 15:08 ../
drwxr-xr-x 6 root root 4096 8月   5 15:08 venv/
root@dev:/data/python/project# 

root@dev:/data/python/project# pwd
/data/python/project
root@dev:/data/python/project# cat venv/bin/pip 
#!/data/python/project/venv/bin/python   ###重點看這行代碼,這是在執行 virtualenv --relocatable ./ven 之前的python引用路徑

# -*- coding: utf-8 -*-
import re
import sys

from pip import main

if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
    sys.exit(main())
root@dev:/data/python/project# 

查看 執行 virtualenv --relocatable ./venv 之後的虛擬環境pip源碼

root@dev:/data/python/project# pwd
/data/python/project
root@dev:/data/python/project# ll
total 12
drwxr-xr-x 3 root root 4096 8月   5 15:08 ./
drwxr-xr-x 3 root root 4096 8月   5 15:08 ../
drwxr-xr-x 6 root root 4096 8月   5 15:08 venv/
root@dev:/data/python/project# virtualenv --relocatable ./venv/
Making script /data/python/project/venv/bin/pip relative
Making script /data/python/project/venv/bin/pip2 relative
Making script /data/python/project/venv/bin/python-config relative
Making script /data/python/project/venv/bin/easy_install relative
Making script /data/python/project/venv/bin/wheel relative
Making script /data/python/project/venv/bin/pip2.7 relative
Making script /data/python/project/venv/bin/easy_install-2.7 relative
root@dev:/data/python/project# cat venv/bin/pip
#!/usr/bin/env python2.7    ###重點看這行代碼,這是在執行 virtualenv --relocatable ./ven 之後的python引用路徑

import os; activate_this=os.path.join(os.path.dirname(os.path.realpath(__file__)), 'activate_this.py'); exec(compile(open(activate_this).read(), activate_this, 'exec'), dict(__file__=activate_this)); del os, activate_this


# -*- coding: utf-8 -*-
import re
import sys

from pip import main

if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
    sys.exit(main())root@dev:/data/python/project# 

可以看到 執行 virtualenv --relocatable 之後,虛擬沙盒環境中的pip命令調用的python路徑發生了改變。

部署 project 這個項目

上述執行 virtualenv --relocatable 之後

  1. 將開發環境下的虛擬沙盒 venv 打包壓縮。

    tar -cvf venv.tar venv/

  2. 將項目代碼拉到線上生產環境目錄/app/proj1

    然後把venv.tar 扔到/app/proj1目錄下,解壓。做解決項目依賴之前的準備工作。

  3. 進入 /app/proj1/venv 目錄下

    重點:
    修改 bin目錄下的active 文件
    vim /app/proj1/venv/bin/active

    將變量名:VIRTUAL_ENV 由原先打包的 /data/python/project/venv 改成實際的 /app/proj1/venv

20170805154134

***至此,整個項目依賴解決完畢,*** python沙盒環境由開發環境移植到生產環境結束。

最後更新:2017-08-13 22:34:37

  上一篇:go  利用Helm簡化Kubernetes應用部署
  下一篇:go  為IT行業創造價值的匯新雲和大大神