1. 程式人生 > >PythonStock(21)股票系統:重新修改docker指令碼,升級python3。精簡程式碼。

PythonStock(21)股票系統:重新修改docker指令碼,升級python3。精簡程式碼。

前言

1,關於股票

最近抽時間把docker 映象重新打了下。
之前使用的是tensorlfow 因為那個是安裝 pandas numpy tushare 還都不方便。
造成映象特別的大,要下載好長時間,而且折騰了幾次,還使用的是python2.
現在 tensorflow 支援的特別好,python3 也支援 tensroflow server 了,於是都升級了下。
都挺好用的。
為了讓映象小想了很多辦法呢。

pythonstock/pythonstock                    latest              934a19df2f8a        26 minutes ago      436MB

本地是 436MB 線上是 152 MB,壓縮了2.86 倍。這樣以後的更新下載,升級,就快多了。

2,構建映象

#使用 python:3.6-slim 做基礎映象減少大小。其中tensorflow再用另外的映象跑資料。
FROM docker.io/python:3.6-slim

# https://opsx.alibaba.com/mirror
# 使用阿里雲映象地址。修改debian apt 更新地址,pip 地址,設定時區。
RUN echo  "deb http://mirrors.aliyun.com/debian/ stretch main non-free contrib\n
\ deb-src http://mirrors.aliyun.com/debian/ stretch main non-free contrib\n\ deb http://mirrors.aliyun.com/debian-security stretch/updates main\n\ deb-src http://mirrors.aliyun.com/debian-security stretch/updates main\n\ deb http://mirrors.aliyun.com/debian/ stretch-updates main non-free contrib\n\ deb-src http://mirrors.aliyun.com/debian/ stretch-updates main non-free contrib\n
\ deb http://mirrors.aliyun.com/debian/ stretch-backports main non-free contrib\n\ deb-src http://mirrors.aliyun.com/debian/ stretch-backports main non-free contrib" > /etc/apt/sources.list && \ echo "[global]\n\ trusted-host=mirrors.aliyun.com\n\ index-url=http://mirrors.aliyun.com/pypi/simple" > /etc/pip.conf && \ ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ echo "Asia/Shanghai" > /etc/timezone #安裝 mysqlclient tushare (pandas ,numpy) tornado bokeh # apt-get autoremove -y 刪除沒有用的依賴lib。減少映象大小。1MB 也要節省。 # apt-get --purge remove 軟體包名稱 , 刪除已安裝包(不保留配置檔案)。 RUN apt-get update && apt-get install -y gcc make axel python3-dev default-libmysqlclient-dev libxml2-dev cron supervisor && \ pip3 install mysqlclient sqlalchemy && \ pip3 install requests && \ pip3 install lxml bs4 && \ pip3 install numpy pandas && \ pip3 install tushare && \ pip3 install tornado torndb && \ pip3 install bokeh stockstats && \ cd /tmp && axel https://nchc.dl.sourceforge.net/project/ta-lib/ta-lib/0.4.0/ta-lib-0.4.0-src.tar.gz && \ tar xvfz ta-lib-0.4.0-src.tar.gz && \ cd ta-lib && ./configure && make && make install && cd /tmp && rm -rf * && \ pip3 install TA-Lib && \ apt-get --purge remove -y gcc make axel python3-dev default-libmysqlclient-dev libxml2-dev && \ rm -rf /root/.cache/* && apt-get clean && apt-get autoremove -y # /usr/local/lib/python3.6/site-packages/pandas/ #1.解決 pandas 資料插入問題。直接修改資料庫驅動 sqlalchemy # 修改:statement.replace("INSERT INTO","INSERT IGNORE INTO") # /usr/local/lib/python3.6/site-packages/sqlalchemy/dialects/mysql/mysqldb.py # 增加了一個 IGNORE 引數。 #2.解決torndb在python3下面的問題: #http://blog.csdn.net/littlethunder/article/details/8917378 RUN echo `date +%Y-%m-%d:%H:%M:%S` >> /etc/docker.build && \ sed -i -e 's/executemany(statement/executemany(statement.replace\("INSERT INTO","INSERT IGNORE INTO")/g' \ /usr/local/lib/python3.6/site-packages/sqlalchemy/dialects/mysql/mysqldb.py && \ rm -f /etc/cron.daily/apt-compat /etc/cron.daily/dpkg /etc/cron.daily/passwd && \ sed -i -e 's/itertools\.izip/zip/g' \ /usr/local/lib/python3.6/site-packages/torndb.py #增加語言utf-8 ENV LANG=zh_CN.UTF-8 ENV LC_CTYPE=zh_CN.UTF-8 ENV LC_ALL=C ENV PYTHONPATH=/data/stock WORKDIR /data #add cron sesrvice. #每分鐘,每小時1分鐘,每天1點1分,每月1號執行 RUN mkdir -p /etc/cron.minutely && mkdir -p /etc/cron.hourly && mkdir -p /etc/cron.monthly && \ echo "SHELL=/bin/sh \n\ PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin \n\ # min hour day month weekday command \n\ */1 * * * * /bin/run-parts /etc/cron.minutely \n\ 10 * * * * /bin/run-parts /etc/cron.hourly \n\ 30 16 * * * /bin/run-parts /etc/cron.daily \n\ 30 17 1,10,20 * * /bin/run-parts /etc/cron.monthly \n" > /var/spool/cron/crontabs/root && \ chmod 600 /var/spool/cron/crontabs/root #增加服務埠 EXPOSE 8888 9999 6006 8500 9001 #經常修改放到最後: ADD jobs /data/stock/jobs ADD libs /data/stock/libs ADD web /data/stock/web ADD supervisor /etc/supervisor ADD jobs/cron.minutely /etc/cron.minutely ADD jobs/cron.hourly /etc/cron.hourly ADD jobs/cron.daily /etc/cron.daily ADD jobs/cron.monthly /etc/cron.monthly RUN mkdir -p /data/logs && ls /data/stock/ && chmod 755 /data/stock/jobs/run_* && \ chmod 755 /etc/cron.minutely/* && chmod 755 /etc/cron.hourly/* && \ chmod 755 /etc/cron.daily/* && chmod 755 /etc/cron.monthly/* ENTRYPOINT ["supervisord","-n","-c","/etc/supervisor/supervisord.conf"]

首先使用的是debian的一個精簡的映象構建的叫:slim 使用的是debian9 的系統。
然後安裝軟體的依賴時候的 python3-dev default-libmysqlclient-dev libxml2-dev 開發庫,在裝完python lib庫之後。
都解除安裝了。apt-get autoremove -y 刪除沒有用的依賴lib。減少映象大小。1MB 也要節省。
apt-get –purge remove 軟體包名稱 , 刪除已安裝包(不保留配置檔案)。
這些命令指令碼必須在一次執行成功,要是拆分成多個的化 docker 的大小還是減少不了的。
因為是多個層了。

同時還安裝了一個 ta-lib 的股票分析庫。後續專門說下。
還是使用 supervisor 啟動應用程式,唯一可惜的就是 supervisor 只支援 python2 ,使用的apt-get進行安裝的。
造成又多裝了一個python2,浪費資源。
不過也不糾結了,等 supervisor 升級支援 python3 在說了。需要等到 3.4 才的版本才行呢,現在還是 3.3的。

3,設定PYTHONPATH

使用環境變數設定了下:ENV PYTHONPATH=/data/stock
這樣程式當中的引用

import libs.stock_web_dic as stock_web_dic
import web.base as webBase
import libs.common as common

就都好使用了。

4,總結

本地是 436MB 線上是 152 MB,壓縮了2.86 倍。
主要是沒有用 tensorflow的官方映象,而是自己打了個python lib的。
計劃 tensorflow 的還是要做,只不過要拆分到別的專案上去,這個就負責抓取股票資料。
進行資料展示統計的。資料統計分析也做,就是不做tensorflow的分析了。
因為因為,那個需要gpu打的映象不一樣。