【fly-iot飞凡物联】(9):使用docker构建Actorcloud的python服务端代码,基于基础镜像python:3.6使用copy方法减少镜像大小,同时删除pyc编译文件,减少容器大小。

前言


本文的原文连接是:
https://blog.csdn.net/freewebsys/article/details/108971807
fly-iot飞凡物联专栏:
https://blog.csdn.net/freewebsys/category_12219758.html

未经博主允许不得转载。
博主CSDN地址是:https://blog.csdn.net/freewebsys
博主掘金地址是:https://juejin.cn/user/585379920479288
博主知乎地址是:https://www.zhihu.com/people/freewebsystem

1,关于Actorcloud项目


ActorCloud 使用手册 ActorCloud 是一个面向低功耗IoT网络,为企业提供一站式平台服务的物联网平台。ActorCloud 在安全可靠的基础上,为设备提供多种协议接入的通信能力,设备数据与消息流管理功能。

平台提供基础设备管理功能以连接、管理海量设备,实现设备的消息通信与数据采集持久化;集成规则引擎与数据可视化管理,灵活开放多种权限级别的管理、控制 API,通过 API 可快速开发上层应用,实现多端接入、设备远程控制。

IoT Hub:为终端上云建立可靠双向连接通道,进行认证鉴权、协议解析与消息路由; 设备管理:终端注册开通与生命周期管理,提供状态、故障、流量的不间断监控; 数据引擎:对获取的终端消息高速持久化、实时解析、规则事务处理与可视化展示; 应用使能:提供终端SDK、APP SDK,开放丰富的 REST API 接口,集成消息推送接口。

在这里插入图片描述

2,使用Docker镜像编译代码


docker 镜像通过基础镜像安装,然后再把

COPY --from=builder /usr/local/lib/python3.6/site-packages /usr/local/lib/python3.6/site-packages

通过这种方式,可以减少相关无用中间库的依赖。减少镜像大小。
把镜像拆分成基础镜像和构建镜像,可以减少重复构建的次数,同时基础镜像用作调试使用:

# 构建后端代码:
# docker build --tag actorcloud-server:v3.0.0 .
# FROM python:3-alpine 使用最新的slim 版本。
# docker build -f ./DockerfileBase -t python:3.6-slim-server-base . 
FROM python:3.6-slim

COPY docker-entrypoint.sh /usr/bin/


# 设置debian的镜像源
RUN echo "deb http://mirrors.aliyun.com/debian/ bullseye main non-free contrib" > /etc/apt/sources.list && \
echo "deb-src http://mirrors.aliyun.com/debian/ bullseye main non-free contrib" >> /etc/apt/sources.list && \
echo "deb http://mirrors.aliyun.com/debian-security/ bullseye-security main" >> /etc/apt/sources.list && \
echo "deb-src http://mirrors.aliyun.com/debian-security/ bullseye-security main" >> /etc/apt/sources.list && \
echo "deb http://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib" >> /etc/apt/sources.list && \
echo "deb-src http://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib" >> /etc/apt/sources.list && \
echo "deb http://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib" >> /etc/apt/sources.list && \
echo "deb-src http://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib" >> /etc/apt/sources.list


# 设置python3的镜像源
RUN  mkdir /root/.pip/ && echo "[global]" > /root/.pip/pip.conf && \
echo "index-url = https://mirrors.aliyun.com/pypi/simple/" >> /root/.pip/pip.conf && \
echo "[install]" >> /root/.pip/pip.conf && \
echo "trusted-host=mirrors.aliyun.com" >> /root/.pip/pip.conf


# 安装需要的lib库
RUN  apt update && apt-get install -y locales libpq-dev python3-dev gcc g++ make && \
     apt clean

#ENV LC_ALL="zh_CN.UTF-8" LANG="zh_CN.UTF-8"
#ENV LC_ALL="en_US.utf-8" LANG="en_US.utf-8"
ENV LC_ALL="C.UTF-8" LANG="C.UTF-8"
ENV PYTHONPATH="/data"
ENV FLASK_APP="/data/manage.py"

ADD requirements.txt /root/requirements.txt
# 最后安装依赖包,然后删除缓存和 pyc 文件,还可以节省40MB 空间。
RUN cd /root && pip3 install -r requirements.txt && rm -rf /root/.cache/ && \
    cd /usr/local/lib/python3.6/site-packages && find ./ -name *.pyc | xargs rm -f  

同时删除了pyc的基础镜像:

# 删除 *.pyc 文件
python 3.6-slim-server-base ef9e5b350248 689MB
大小从 689 减少到 652
python 3.6-slim-server-base 7134559c9496 652MB

然后是构建的镜像:

# 构建后端代码:
# docker build --tag actorcloud-server:v3.0.0 .
# FROM python:3-alpine 使用最新的slim 版本。
# 
FROM python:3.6-slim-server-base as builder

# 拷贝本地文件到目录
COPY . /data

# service
FROM python:3.6-slim

# 直接使用基础镜像然后拷贝 site-packages 安装包即可。
COPY --from=builder /data /data
COPY --from=builder /usr/local/lib/python3.6/site-packages /usr/local/lib/python3.6/site-packages
COPY --from=builder /usr/local/bin/flask /usr/local/bin/flask
COPY --from=builder /data/docker-entrypoint.sh /usr/bin/

WORKDIR /data
# 设置python 的环境变量和 fask app文件。
ENV LC_ALL="C.UTF-8" LANG="C.UTF-8"
ENV PYTHONPATH="/data"
ENV FLASK_APP="/data/manage.py"

EXPOSE 7000 7001

ENTRYPOINT ["docker-entrypoint.sh"]

CMD ["/bin/sh"]

因为进行数据库初始化的时候需要 flask 命令,所以也一起拷贝过去。
经过优化的版本,删除了 pyc 文件之后镜像大小从:

flyiotadm/fly-iot-backend-python v1.0 800d5b69ef0a 355MB
减小到:
flyiotadm/fly-iot-backend-python v1.0 5c8ee7c543d0 318MB

这个只是本地的大小,docker hub 上显示的会更小点。

删除的pyc 文件不影响python 使用应用可以正常启动:

NFO  [alembic.env] No changes in schema detected.
INFO  [alembic.runtime.migration] Context impl PostgresqlImpl.
INFO  [alembic.runtime.migration] Will assume transactional DDL.
########## project_manage.project_upgrade() 
database upgrade successfully!
######### execute_type upgrade 
services table init successfully!
resources successfully!
Update default roles successfully!
dict_code table init successfully!
system info table init successfully!
lwm2m_object lwm2m_item table init successfully!
########## project_manage.project_upgrade()  Command '['which', 'gunicorn']' returned non-zero exit status 1.
############# start python3 #############
 * Running on http://0.0.0.0:7000/ (Press CTRL+C to quit)

3,总结


终于找到一个办法减少镜像大小了,直接做基础镜像,然后使用copy 文件site-packages 。
可以最大限度的减少镜像大小,加快镜像下载,同时删除了pyc 文件还可以减少 40 MB 存储。
而且不影响镜像启动。都可以正常运行。

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

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/freewebsys/article/details/130909770
今日推荐