这段时间,我一直忙于将 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. 大数据学习day38----数据仓库01-----区域字典的生成

    更多内容见文档 1. 区域字典的生成 mysql中有如下表格数据 现要将这类数据转换成(GEOHASH码, 省,市,区)如下所示 (1)第一步:在mysql中使用sql语句对表格数据进行整理(此处使用 ...

  2. 大数据学习day31------spark11-------1. Redis的安装和启动,2 redis客户端 3.Redis的数据类型 4. kafka(安装和常用命令)5.kafka java客户端

    1. Redis Redis是目前一个非常优秀的key-value存储系统(内存的NoSQL数据库).和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list ...

  3. 【XSS】再谈CSP内容安全策略

    再谈CSP内容安全策略 之前每次都是想的很浅,或者只是个理论派,事实证明就是得动手实践 参考 CSP的用法 官方文档 通过设置属性来告诉浏览器允许加载的资源数据来源.可通过Response响应头来设置 ...

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

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

  5. 【Linux】【Services】【VersionControl】Git基础概念及使用

    1. 简介 1.1. 版本控制工具: 本地版本控制系统: 集中化版本控制系统:CVS,SVN 分布式版本控制系统: BitKeeper,Git 1.2. 官方网站: https://git-scm.c ...

  6. MyBatis(2):CRUD操作

    编写接口 import com.shandx.pojo.User; import java.util.List; public interface UserMapper { <span clas ...

  7. Docker从入门到精通(一)——初识

    1.Docker 是什么? Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容 ...

  8. Netty 编解码奥秘

    Netty中编解码 Netty 的解码器有很多种,比如基于长度的,基于分割符的,私有协议的.但是,总体的思路都是一致的. 拆包思路:当数据满足了 解码条件时,将其拆开.放到数组.然后发送到业务 han ...

  9. Kerboros 认证

    转:Kerberos介绍(全)

  10. [BUUCTF]REVERSE——[GUET-CTF2019]re

    [GUET-CTF2019]re 附件 步骤: 查壳儿,upx壳,64位程序 upx脱壳儿,然后扔进64位ida,通过检索字符串,找到有关flag的信息定位到关键函数 让我们输入flag,然后满足su ...