起因
公司需要进行产品的国产化改造,harbor与原有产品集成,但因为某些原因无法升级V2,在5月份的时候进行了ARM版本编译。
修改源码
使用 git clone将代码下载至本地
git clone https://github.com/goharbor/harbor.git
前置准备(说明)
- 编译过程必须使用其他基础发行版,经测试发现银河麒麟V10SP1和SP3的版本编译成功后都无法运行,排查后发现问题可能与内核有关(未深入排查,但相同代码在Debian编译后,在麒麟系统可以使用)
- 在编译过程中尽量使用大陆境外区域的服务器,否则docker镜像及github拉取速度极慢或需要修改源码进行代理下载
建议使用Debian进行编译,本人编译采用Azure的香港区ARM架构的Debian11(毕竟白嫖还是香的)
修改photon镜像至4.0版本
如下命令在v1.10.17之后不需要执行,官方已升级photon至4.0版本
find ./ -type f|grep "Dockerfile$"|grep -v ".D"|xargs sed -i "s#photon:2.0#photon:4.0#g"
find ./ -type f|grep "Dockerfile$"|grep -v ".D"|xargs sed -i "s#photon:3.0#photon:4.0#g"
代码修改
首先修改Makefile,以声明当前要编译的版本,及打开基础依赖镜像构建
基础镜像:harbor构建的时候,会先进行基础构建,基础构建的包对harbor本身的业务代码是没有影响的,仅仅是基础依赖,若在开发迭代harbor的过程中进行了harbor代码修改,在x86上是无需进行构建基础镜像的,可以快速编译,打包。但当前编译ARM,基础镜像的架构是X86,与当前无法匹配,所以要重新进行编译基础镜像。
# 版本名称tag
VERSIONTAG=v1.10.17-arm64
# 基础镜像tag
BASEIMAGETAG=v1.10.17-arm64
# 软件包tag
PKGVERSIONTAG=v1.10.17-arm64
# 是否从dockerhub拉取基础镜像
PULL_BASE_FROM_DOCKERHUB=false
另外,在build_base_images操作下,将--pull参数取消,这样在本地编译好的base镜像才会被使用
修改make/photon/core/Dockerfile(该步骤可能无需修改)
- RUN chmod u+x /harbor/harbor_core
+ RUN chown -R harbor:harbor /harbor/ \
&& chmod u+x /harbor/harbor_core
修改make/photon/db/Dockerfile.base 替换所有的x86至arm架构
修改make/photon/db/rpm_builder.sh 替换所有的x86至arm架构
- x86_64
+ aarch64
将harbor-arm仓库的redis目录下的文件全部替换更新至make/photon/redis/目录下
版本编译
编译逻辑解释:
- 先编译photon中可以运行的基础rpm包(新版本可能已升级至新版postgresql和redis)
- 进行基础依赖镜像编译
- 进行离线版本编译
- 打包镜像至tar.gz文件,与官方发布的离线包一致
修改部分文件的执行权限
chmod +x make/install.sh make/prepare make/photon/db/rpm_builder.sh make/photon/redis/rpm_builder.sh make/photon/registry/builder make/checkenv.sh
编译postgresql版本和redis版本
cd make/photon/db
./rpm_builder.sh
cd make/photon/redis
./rpm_builder.sh
进行基础依赖镜像编译
make build_base_images GOBUILDIMAGE=golang:1.17.9 COMPILETAG=compile_golangimage
进行版本离线编译打包
make package_offline GOBUILDIMAGE=golang:1.17.9 COMPILETAG=compile_golangimage
提取harbor目录内离线包tar.gz即可