天天看點

在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無任何問題。

繼續閱讀