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
查看沙盒目錄
進入虛擬環境,我們通過進入這個沙盒環境,執行我們開發的項目代碼,從而避免汙染係統的python環境
root@dev:/data/python/project# source venv/bin/activate
(venv) root@dev:/data/python/project#
看到 使用沙盒環境之後,命令行頭部都帶著一個沙盒目錄名稱[venv]
退出虛擬環境
deactivate
查看虛擬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 之後
-
將開發環境下的虛擬沙盒 venv 打包壓縮。
tar -cvf venv.tar venv/
-
將項目代碼拉到線上生產環境目錄/app/proj1
然後把venv.tar 扔到/app/proj1目錄下,解壓。做解決項目依賴之前的準備工作。
-
進入 /app/proj1/venv 目錄下
重點:
修改 bin目錄下的active 文件
vim /app/proj1/venv/bin/active將變量名:VIRTUAL_ENV 由原先打包的 /data/python/project/venv 改成實際的 /app/proj1/venv
***至此,整個項目依賴解決完畢,*** python沙盒環境由開發環境移植到生產環境結束。
最後更新:2017-08-13 22:34:37