python项目在无外网的生产环境解决沙盒依赖问题

  1. 云栖社区>
  2. 袋鼠云技术团队>
  3. 博客>
  4. 正文

python项目在无外网的生产环境解决沙盒依赖问题

21qwe 2017-08-05 15:56:31 浏览3676
展开阅读全文

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

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沙盒环境由开发环境移植到生产环境结束。




网友评论

登录后评论
0/500
评论
21qwe
+ 关注
所属云栖号: 袋鼠云技术团队