Alpine编译.apk安装包

  最近需要将某docker项目从centos系统迁移到alpine中,因此需要重新编译项目;参考国外某些项目frr已写好APKBUILD,Dockerfile和build.sh等文件,这里对其主要过程分析并记录一下,便于以后打包过程的回顾。本文最后一节,罗列了一些参考模板;
  本文最新状态可查看源站链接:Alpine编译.apk安装包

1. 构建发布压缩包

  该步骤主要同项目构建过程相关,需要根据不同情况进行编译;

  这一步主要是构建代码编译采用的压缩包,确认版本号等过程;读者可以在宿主机上编译出压缩包或编写到Dockerfile和脚本,FROM alpine:edge as source-builder,并在其中安装所需依赖.

2. 编写APKBUILD等文件

  构建.apk包的时候,需要编写自己的APKBUILD文件和其他文件,如下图所示,其中frr为本文需要构建安装包的项目;.pre-install和pre-deinstall等文件,是安装和卸载apk包时所执行脚本;APKBUILD.in为生成APKBUILD文件的模板文件;编写APKBUILD文件时,检查项目中dep依赖库包可以通过alpinelinux官方地址查询。

alpine_abuild_deps

  读者也可以参考abuild官方gitlab地址某标准案例:https://gitlab.alpinelinux.org/alpine/abuild/-/blob/master/sample.APKBUILD
  根据项目实际情况,编写shell脚本以及其中必须的函数prepare(),build(),package(),check();具体可以索引到参考文章alpinelinux的abuild中APKBUILD设置

3. 创建alpine编译容器

  因网速问题,这里容器拉取到上述编译工具包后,已做成容器镜像并上传DockerHub,便于用户拉取使用,读者可自行构造镜像或拉取该容器。

  在容器中创建编译apk包所需目录和相关配置

4. 准备alpine构建环境并编译打包

  拷贝源码tarball和apk编译文件到alpine容器相同目录下,此时该目录中应包含上述的XXX.pre-install,XXX.pre-deinstall,APKBUILD以及XXX.tar.gz文件;

最后可以在/pkgs/apk目录中查到apk包

  • 问题1:报错 Checking sanity of /dist/APKBUILD...ERROR: 7.3.1-2.6.1 is not a valid version
    解决方法:abuild对版本号格式有约束,通过下图可知对应版本号格式,例如1.0.0-r0,参考文章:APKBUILD_Reference
    abuild-version

  • 问题2:报错cc1plus: all warnings being treated as errors
    解决方法:设置环境变量;c工程设置export CFLAGS="-Wno-error";c++工程设置export CXXFLAGS="-Wno-error";

  • 问题3:报错Tracing dependencies... ERROR: /usr/lib/libprotobuf-c.so.1.0.0: Could not find owner package
    解决方法:依赖项可能为用户自定义依赖库,或第三方库。编译安装包最后步骤,会默认会检查依赖库关系;这个需要注意几个地方,需要在编译Makefile文件中添加-lprotobuf-c,安装该apk模块apk add protobuf-c,并写入APKBUILD文件的依赖项检查中。

5. Abuild范式了解(类似rpmbuild)

Abuild官方wiki文档,这里将abuild范式罗列如下

6. 参考文件

  1. 运行build.sh,首先第一步是通过Dockerfile文件中配置构建alpine编译目标容器,并将相关的APKBUILD和dist压缩文件拷贝,进行编译;
  2. build.sh第二步是将编译好的apk安装包安装并制作镜像;
  • frr/docker/alpine/build.sh文件

  • frr/docker/alpine/Dockerfile

  • frr/alpine/APKBUILD文件

赞赏

微信赞赏支付宝赞赏

发表评论

邮箱地址不会被公开。 必填项已用*标注