这段时间,我一直忙于将 Rainbond 源码构建模块移植到 Arm64/aarch64 架构中。对于 Python 项目而言,可以直接通过源代码编译成为可运行在各种容器平台之上的容器镜像。这个过程不需要使用者掌握任何容器化知识。在 Rainbond 源码构建适配 Arm64 架构之后,用户可以直接利用编译完成的容器镜像交付到 Arm64 环境下,比如华为的鲲鹏系列服务器中。

Python源码编译简介

在当前场景下,我要探索如何在 Arm64 架构下,通过 builder 这一 Rainbond 源码编译模块,完成 Python 项目的编译与容器化。

Python 是一种解释型的脚本语言,所有的运行介质都是脚本。从这一特性出发,我只需要将 Python 自身的解释器在 Arm64 环境中编译运行起来,任务就已经完成了一大半。Python 官方支持在各种平台上由包管理器安装 Python 解释器,但是这不符合 builder 的需求。builder 构建完成的最终产物最终需要转移到 runner 运行模块中进行最终的镜像打包,这要求 builder 中安装的 Python 解释器是便携式 (portable) 的预编译安装包。

接下来,我要开始在具有 M1 芯片的 MacBookPro 上编译Python。

这台 MacBookPro 上预装了 Docker Desktop 为我提供容器环境。

编译过程

为了保证最终环境的一致性,我选择使用 builder 项目所用的基础镜像进行编译。这一基础镜像已经推送了 Arm64 版本到 DockerHub 中

docker run -ti --name=compiler rainbond/cedar14:20211224 bash

进入容器环境后,生成专门用于构建的目录,下载并解压 Python 源码包。当前选择的版本是 Python-3.7.10

mkdir -p /app/src && cd /app
wget https://www.python.org/ftp/python/3.7.10/Python-3.7.10.tgz
tar xzf Python-3.7.10.tgz -C src
cd src/Python-3.7.10/

执行编译

./configure --prefix=/app/python
make && make install
  • --prefix=/app/python 指定了编译后生成文件的路径

编译完成后,检查编译产物

ls -l /app/python/

得到以下返回

total 16
drwxr-xr-x 2 root root 4096 Dec 31 15:46 bin
drwxr-xr-x 3 root root 4096 Dec 31 15:46 include
drwxr-xr-x 4 root root 4096 Dec 31 15:46 lib
drwxr-xr-x 3 root root 4096 Dec 31 15:46 share

打包

在进行打包之前,还有两处可以做的优化。

首先,可以删除一些专门用于测试的编译产物。

下面的代码,来自于官方 Python 容器镜像的 Dockerfile https://github.com/docker-library/python/blob/master/Dockerfile-alpine.template

执行后,编译产物的总大小,缩小了100MB左右

find /app/python -depth \
\( \
\( -type d -a \( -name test -o -name tests -o -name idle_test \) \) \
-o \
\( -type f -a \( -name '*.pyc' -o -name '*.pyo' \) \) \
\) -exec rm -rf '{}' +;

其次,编译而来的可执行文件 /app/python/bin/python3.7 并不是我们常用的 python 命令,所以可以为它改个名字,便于以后使用

mv /app/python/bin/python3.7 /app/python/bin/python

最终,可以在 python 目录下进行打包操作

cd  /app/python
tar czf python-3.7.10-arm64.tar.gz ./*

最终的压缩包尺寸为 28M,非常便携。

验证

为了验证 python-3.7.10-arm64.tar.gz 可以在 buider 环境中插之即用,我重新启动了一个容器来验证其功能。

下载并解压预编译安装包

docker run -ti --name=test rainbond/cedar14:20211224 bash
mkdir /python
curl https://buildpack.oss-cn-shanghai.aliyuncs.com/python/cedar-14/runtimes/python-3.7.10-arm64.tar.gz | tar xz -C /python

验证功能

/python/bin/python --version
Python 3.7.10

Arm64架构下编译便携Python的更多相关文章

  1. Arm64架构下静态编译Nginx

    这段时间,我一直忙于将 Rainbond 源码构建模块移植到 Arm64/aarch64 架构中.这一源码构建模块可以将指定代码仓库中包含的源码,拉取构建成为容器镜像,在各种容器平台中运行.目前支持的 ...

  2. [转]linux下编译boost.python

    转自:http://blog.csdn.net/gong_xucheng/article/details/25045407 linux下编译boost.python 最近项目使用c++操作python ...

  3. ARM64架构下,OpenJDK的官方Docker镜像为何没有8版本

    为什么需要ARM64架构的OpenJDK8的Docker镜像 对现有的Java应用,之前一直运行在x86处理器环境下,编译和运行都是JDK8,如今在树莓派的Docker环境运行(也可能是其他ARM环境 ...

  4. ARM64架构下登录mysql出错:mysql: error while loading shared libraries: libncurses.so.5: cannot open shared object file:

    Linux下登录mysql出错:mysql: error while loading shared libraries: libncurses.so.5: cannot open shared obj ...

  5. Linux 下编译升级 Python

    一.Centos下升级python3.4.3 1.下载安装 wget http://www.python.org/ftp/python/3.4.3/Python-3.4.3.tgz wget http ...

  6. CentOS下编译安装python包管理安装工具pip教程

    ubuntu 安装pip 代码如下: apt-get install python-pip 安装requests, pip install requests 对于centos的,直接 yum inst ...

  7. linux下编译安装python

    从官网下载指定的源码包 https://www.python.org/downloads/source/ 把源码文件以二进制方式上传到linux服务器 安装python需要用到gcc工具,首先查看gc ...

  8. ARM架构下的Docker环境,OpenJDK官方没有8版本镜像,如何完美解决?

    为什么需要ARM架构下的OpenJDK8的Docker镜像? 对现有的Java应用,之前一直运行在x86处理器环境下,编译和运行都是JDK8,如今在树莓派的Docker环境运行(或者其他ARM架构电脑 ...

  9. 《python解释器源码剖析》第0章--python的架构与编译python

    本系列是以陈儒先生的<python源码剖析>为学习素材,所记录的学习内容.不同的是陈儒先生的<python源码剖析>所剖析的是python2.5,本系列对应的是python3. ...

随机推荐

  1. c学习 - 第五章:选择结构程序设计

    5.2 关系运算符与逻辑运算符 !(非) ^ 高 算术运算符 | 关系运算符 | &&和 || | 赋值运算符 | 低

  2. springboot-使用AOP日志拦截实现

    一 前言 借助spring的AOP功能,我们可以将AOP应用至全局异常处理,全局请求拦截等,本篇文章的核心功能就是使用AOP实现日志记录,比如哪些用户进行了哪些操作,对于一个成功的项目这是必须记录的, ...

  3. Spring(3):AOP面向切面编程

    一,AOP介绍 AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开 ...

  4. 一个统计 CPU 内存 硬盘 使用率的shell脚本

    一个统计 CPU 内存 硬盘 使用率的shell脚本,供大家学习参考 #!/bin/bash #This script is use for describle CPU Hard Memery Uti ...

  5. idea如何在git上将分支代码合并到主干

    1.首先将idea中的代码分支切换到master分支,可以看到我们在dev上提交的代码 在master上是没有的 2.如图所示,在remote branch 上选择分支,点击后面的三角图标,展开之后选 ...

  6. profile的使用详解

    前言 在开发过程中,我们的项目会存在不同的运行环境,比如开发环境.测试环境.生产环境,而我们的项目在不同的环境中,有的配置可能会不一样,比如数据源配置.日志文件配置.以及一些软件运行过程中的基本配置, ...

  7. 如何使用table布局静态网页

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  8. 『与善仁』Appium基础 — 21、元素的基本操作

    目录 1.元素的基本操作说明 (1)点击操作 (2)清空操作 (3)输入操作 2.综合练习 1.元素的基本操作说明 (1)点击操作 点击操作:click()方法.(同Selenium中使用方式一致) ...

  9. [BUUCTF]REVERSE——helloword

    helloword 题目是安卓逆向.安卓逆向工具下载地址 用APKIDE打开附件,ctf+f调出检索版,检索main函数,能看到flag字符串 flag{7631a988259a00816deda84 ...

  10. ANTLR 语法设计

    下面学习如何编写语法. 如何定义语法规则 一种语言模式就是一种递归的语法结构. 我们需要从一系列有代表性的输入文件中归纳出一门语言的结构.在完成这样的归纳工作后,我们就可以正式使用ANTLR语法来表达 ...