docker多阶段构建并编译python项目为so(保护源码)

项目结构

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"]

你可能感兴趣的:(python,Docker,python,docker,so)