python项目在无外网的生产环境解决沙盒依赖问题
在我们实际的生产项目部署过程中,比如银行,政务内网,无法访问某些依赖源。结合实际情况,我们看下如何解决这个问题。
开发环境
建立项目开发路径
mkdir -p /data/python/project/
我们先查看是否有pip命令工具
pip的命令行安装看官网链接:
https://pip.pypa.io/en/stable/installing/#installing-with-get-pip-py
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沙盒环境由开发环境移植到生产环境结束。