这段时间,我一直忙于将 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. 大数据学习day24-------spark07-----1. sortBy是Transformation算子,为什么会触发Action 2. SparkSQL 3. DataFrame的创建 4. DSL风格API语法 5 两种风格(SQL、DSL)计算workcount案例

    1. sortBy是Transformation算子,为什么会触发Action sortBy需要对数据进行全局排序,其需要用到RangePartitioner,而在创建RangePartitioner ...

  2. Identity Server 4 从入门到落地(八)—— .Net Framework 客户端

    前面的部分: Identity Server 4 从入门到落地(一)-- 从IdentityServer4.Admin开始 Identity Server 4 从入门到落地(二)-- 理解授权码模式 ...

  3. Android 基础UI组件(一)

    1.Toast //显示文字 Toast.makeText(this,"Toast显示文本",Toast.LENGTH_SHORT).show(); //显示图片 Toast to ...

  4. Can we call an undeclared function in C++?

    Calling an undeclared function is poor style in C (See this) and illegal in C++. So is passing argum ...

  5. my36_InnoDB关键特性之change buffer

    一.关于IOT:索引组织表 表在存储的时候按照主键排序进行存储,同时在主键上建立一棵树,这样就形成了一个索引组织表,一个表的存储方式以索引的方式来组织存储的. 所以,MySQL表一定要加上主键,通过主 ...

  6. 【HarmonyOS】【xml】使用xml绘制视频播放控制栏

    本文记录HarmonyOS使用xml绘制视频播放控制栏 效果图如下 代码如下 点击查看代码 <?xml version="1.0" encoding="utf-8& ...

  7. pytest_BDD + allure 自动化测试框架

    一.项目结构 --driverAction ----Assessement.py ----basicPageAction.py ----BrowserDriver.py --drivers ----c ...

  8. 攻击科普:ARP攻击

    目录 一.介绍 二.解决办法 一.介绍 ARP攻击的局限性 ARP攻击仅能在以太网(局域网如:机房.内网.公司网络等)进行. 无法对外网(互联网.非本区域内的局域网)进行攻击. ARP攻击就是通过伪造 ...

  9. InnoDB学习(四)之RedoLog和UndoLog

    BinLog是MySQL Server层的日志,所有的MySQL存储引擎都支持BinLog.BinLog可以支持主从复制和数据恢复,但是对事务的ACID特性支持比较差.InnoDB存储引擎引入Redo ...

  10. Hibernate框架使用之环境搭建

    第一步:引入所需的jar包 第二步:创建实体类,配置实体类与数据表的映射关系 创建实体类 User.java package cn.hao.entity; public class User { /* ...