天天看点

在Debian的Docker容器下使用PyV8配置(同样适用Ubuntu)

最近在项目中需要使用PyV8,调用JS库进行一些函数的处理,PyV8在Windows也就是我的开发环境下安装异常顺利,但是移植到Linux后各种报错,而且我的测试机使用CentOS,而上线服务器使用基于Debian的Docker,调试着实费了一番功夫,现将问题和解决方案整理。

目前实现环境:

操作系统:Docker Debian GNU/Linux 9 (stretch)

数据库:mariaDB 10.2.7

Python版本:2.7 64位

PyV8版本:最新版,地址https://github.com/emmetio/pyv8-binaries/raw/master/pyv8-linux64.zip

目前一些小的问题:

1. PyV8如果实时调用,有一定概率直接崩溃,无论是Windows还是Linux都会这样,主要表现在断点调试过程中或调用超时,Docker直接崩了,日志没有记录,但是如果使用缓存进行Cache就没问题,若调用PyV8不同时调用浏览器DOM则无问题,目前直接使用后台调用。

2. 在Linux上通过浏览器请求同时多次调用PyV8会超时,但是Windows请求或者后台直接请求则没有问题,查看数据未见异常,原因不明,如果把多次请求改成一次请求则可以,个人认为可能是多次请求锁了文件,但是增加sleep函数每次请求后暂停也不正常,目前只能使用后台调用的方式。

PyV8在Docker中的安装

网上有多种方式进行PyV8的安装,无非以下几种方式:

1. pip install安装

2. 拷贝编译好的PyV8的binary文件到Python目录,同时修改环境变量

3. 下载源文件,编译安装

在Docker中1肯定是行不通,各种报错,3理论上可以,但是编译报错也很多,最好是使用编译好的文件,查询Docker Hub有例子,直接wget后解压然后拷贝,参考:

https://hub.docker.com/r/lolikiller/pyv8/~/dockerfile/

部分Dockerfile(已脱敏),注意标红部分

FROM docker.xxx.domain:80/runtime/debian9/python

RUN apt-get install -y cron libldap2-dev gcc libsasl2-dev vim rsyslog libboost-all-dev aptitude scons libboost-python-dev wget unzip
RUN pip install pyldap \
    && pip install fluent-logger \
    && pip install gunicorn \
    && pip install bottle \
    && pip install requests \
    && pip install PyMySQL \
    && pip install mako \
    && pip install jinja2 \
    && pip install python-memcached \
    && pip install pandas \
    && pip install xlsxwriter \
    && pip install sqlalchemy \
    && pip install ipython==5.7.0 \
    && pip install altair \
    && pip install pdvega \
    && ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

RUN wget https://github.com/emmetio/pyv8-binaries/raw/master/pyv8-linux64.zip \
  && unzip pyv8-linux64 \
  && cp _PyV8.so /usr/local/lib/python2.7/site-packages/ \
  && cp PyV8.py /usr/local/lib/python2.7/site-packages/
RUN apt-get clean \
    && apt-get autoclean \
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

EXPOSE 80
COPY src/xxx /build/
WORKDIR /build
CMD xxx      

注意事项

PyV8使用涉及多个库,注意apt-get install的标红部分,wget和unzip主要是下载源文件用,其中pyv8对应的版本可自行修改,我的是Python64位, 下方标红部分则是安装方法,可见也是解压后拷贝二进制文件到Python第三方库中。

至此配置全部完成,后台调用PyV8无任何问题。

继续阅读