项目结构
src
为源码路径
project_name:
./Dockerfile-compile
./compile.py
./src
compile脚本
# -*- coding: utf-8 -*-
# @Author : llc
# @Time : 2021/11/15 15:13
import os
from Cython.Build import cythonize
from setuptools import setup, Extension
def c_compile(name, modules):
"""
使用Cython进行编译
:param str name: 项目名称
:param list modules: [(module_name, source_file_path), (..., ...)]
:return:
"""
module_list = []
for m in modules:
module_list.append(
Extension(name=m[0], sources=[m[1]])
)
setup(
name=name,
ext_modules=cythonize(
module_list=module_list,
language_level=3, # python3
),
zip_safe=False,
install_requires=[
'Cython',
]
)
modules = []
# 遍历找到需要编译的py文件
for root, dirs, files in os.walk('./src'):
for file in files:
if not file.endswith('.py'):
continue
dir_list = root.split(os.path.sep)
name = '.'.join(dir_list).lstrip('./')
modules.append((name + '.' + os.path.splitext(file)[0], os.path.join(root, file)))
print(modules)
# 开始编译
c_compile('compile', modules)
# 删除py文件和c文件
for root, dirs, files in os.walk('./src'):
for file in files:
if file.endswith('.so'):
continue
file_path = os.path.join(root, file)
os.remove(file_path)
Dockerfile-compile
FROM intellegensdocker/cython:3.9 as compile
COPY compile.py /tmp/compile.py
COPY src /tmp/src
# 执行编译程序
RUN cd /tmp && python compile.py build_ext --inplace -j8
FROM python:3.9-slim-bullseye
MAINTAINER LLC
# 使用上海时区
ENV TZ=Asia/Shanghai
# 拷贝依赖包文件
COPY requirements.txt /tmp/requirements.txt
# 基础环境安装
RUN \
echo "deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free" > /etc/apt/sources.list && \
echo "deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free">> /etc/apt/sources.list && \
echo "deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free">> /etc/apt/sources.list && \
echo "deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free">> /etc/apt/sources.list && \
\
apt-get update && \
apt-get install -y gcc python3-dev --no-install-recommends && \
\
python -m pip install -U pip && \
python -m pip install -r /tmp/requirements.txt && \
python -m pip install supervisor uwsgi && \
\
echo_supervisord_conf > /etc/supervisord.conf && \
echo "[include]" >> /etc/supervisord.conf && \
echo "files = /etc/supervisord.d/*.ini" >> /etc/supervisord.conf && \
\
apt-get purge -y gcc python3-dev && \
apt-get autoremove -y && \
rm -rf /var/lib/apt/lists/* && \
rm -rf ~/.cache/pip/*
# 工作空间
WORKDIR /work/src
# 添加pythonpath
ENV PYTHONPATH=/work/src
# 程序部署
COPY conf/uwsgi.ini /work/conf/uwsgi.ini
COPY conf/supervisor.ini /etc/supervisord.d/supervisor.ini
# 拷贝编译后的结果
COPY --from=compile /tmp/src /work/src
ENTRYPOINT ["supervisord", "-n","-c", "/etc/supervisord.conf"]