PythonStock(24)股票系统:拆分成基础镜像,应用镜像。并且安装月份定时上传镜像,保存最小的软件包。docker镜像只有200MB压缩下载的,精简了下界面。

前言


使用Python开发一个web股票项目。
【github项目地址】:
https://github.com/pythonstock/stock
【知乎专栏地址】:
https://zhuanlan.zhihu.com/pythonstock
【docker hub地址下载】:
https://hub.docker.com/r/pythonstock/pythonstock
【相关stock资料分类】:
http://blog.csdn.net/freewebsys/article/category/7076584
主要使用开发语言是python。
使用的lib库是pandas,tushare,TensorFlow,tornado等。

本文的原文连接是: https://blog.csdn.net/freewebsys/article/details/107216603
未经博主允许不得转载。

1,折腾Dokcer 基础镜像


最近发现股票系统的代码跑不了。
因为几个问题吧。
1,TuShare的 api 报错了。
2,升级了python的代码,好像使用with的时候。没有返回curr游标。造成代码执行错误。
3,报表展示界面上还有bug,估计是升级的问题造成的,js报错了。

2,基础镜像


#使用 python:3.6-slim 做基础镜像减少大小。其中tensorflow再用另外的镜像跑数据。

# 之前使用的是python:3.6-slim
# 可以更新 3.7-slim-stretch slim-stretch

# https://hub.docker.com/_/python?tab=tags&page=1&name=3.6-slim-stretch
# 用这个做为基础镜像,防止每次都进行构建。

FROM docker.io/python:3.6-slim-stretch

# 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  && pip3 install jupyter && \
    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
# 3. 解决 type 问题,使用sed 进行替换。
#  File "/usr/local/lib/python3.6/site-packages/torndb.py", line 260, in <module>
#    CONVERSIONS[field_type] = [(FLAG.BINARY, str)] + CONVERSIONS[field_type]
#  TypeError: can only concatenate list (not "type") to list

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  && \
    sed -i -e 's/\+ CONVERSIONS\[field_type\]/\+ \[CONVERSIONS\[field_type\],bytes\]/g' \
    /usr/local/lib/python3.6/site-packages/torndb.py

# 增加 TensorFlow 的支持,使用最新的2.0 编写代码。目前还是使用 1.x 吧,还没有学明白。
# RUN pip3 install tensorflow==2.0.0-rc1 keras

# RUN pip3 install tensorflow keras sklearn

RUN pip3 install sklearn

#增加语言utf-8
ENV LANG=zh_CN.UTF-8
ENV LC_CTYPE=zh_CN.UTF-8
ENV LC_ALL=C
ENV PYTHONPATH=/data/stock

安装了很多有用的Lib库。
mysqlclient sqlalchemy requests numpy tushare tornado torndb bokeh stockstats ta-lib jupyter sklearn

但是把 tensorflow 去掉了第一,这个库非常大,安装完成都2G了。
第二我也没有用到,其实是后续想用这个做个训练。
到时候用到再说吧。

然后拆分应用镜像:

# 拆分基础镜像: docker/dockerfile


# 基础镜像,按照季度,月度更新。不影响应用镜像的构建。

FROM pythonstock/pythonstock:base-2020-07

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


#增加服务端口就两个 6006 8500 9001
EXPOSE 8888 9999

#经常修改放到最后:
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"]

每次升级的时候根据基础镜像进行打包升级。
这样我构建镜像速度就快多了。同时代码依赖的Lib库也稳定多了。
要是在一个镜像里面,有的时候安装软件都不成功。下载啥的都不成功。
在docker 构建每一个层的时候。有的时候是有缓存的,有的时候还要每次都安装。
现在非常方便了。

在这里插入图片描述
在docker hub 上面是压缩的文件:

本地上是解压缩的。
在这里插入图片描述
本地呢是 600 MB。也还可以。

3,registry-mirrors配置文件


https://registry.docker-cn.com/
这个域名也ping 不通了。
也就是能用的代理 也就 163 啦。

https://docker.mirrors.ustc.edu.cn
这个地址也是跳到了 163 上面了。
阿里的还根据每人ID进行配置。综上还是 163的不错。

扫描二维码关注公众号,回复: 11708512 查看本文章
/etc/docker/daemon.json
{
"selinux-enabled": false,
  "data-root" : "/media/test/NewDisk1/opt/docker/data",
"registry-mirrors": ["http://hub-mirror.c.163.com"] 
}

3,界面优化


因为 好多数据获得有问题,是编码错误造成的。
有些说是因为API 接口增加了GZIP 压缩造成的。懒得折腾了。直接略过了。
之研究相关API即可。

在这里插入图片描述

3,总结


最近股票大涨,赶紧加快股票系统的开发。
每日数据也是经过大量计算的。
需要 20 多分钟才可以跑完数据。经过了大量计算呢。
看了下之前写的逻辑也挺复杂的,佩服我自己了都。
大家一起来学习下哈。

本文的原文连接是:
https://blog.csdn.net/freewebsys/article/details/107216603

博主地址是:http://blog.csdn.net/freewebsys

猜你喜欢

转载自blog.csdn.net/freewebsys/article/details/107216603