在信创环境中编译 ARM 版 Harbor 的注意事项
解读
面试官通过“信创+ARM+Harbor 编译”三重限定,考察候选人是否同时具备国产化合规意识、多架构镜像构建能力以及离线/受限场景下的工程化经验。信创环境通常指国产 CPU(鲲鹏、飞腾、龙芯)、国产操作系统(麒麟 V10、统信 UOS)、强制离线、无 root 权限、必须基于国内源的交付场景;ARM 版又进一步要求交叉编译、基础镜像源替换、Go 依赖代理、Node 原生模块重编等细节。回答时要体现“能干活、懂政策、不出事”。
知识点
- 信创合规三件套:CPU 架构识别、操作系统白名单、密码算法合规(SM2/SM3/SM4)
- ARM64 编译链:docker buildx qemu 交叉编译、Golang GOARCH=arm64、Nodejs node-gyp arm64、PostgreSQL/redis 等上游 ARM 官方镜像可用性
- 离线交付:vendor 缓存、go mod proxy 国内镜像(goproxy.cn)、npm 淘宝源、yarn offline cache、helm chart 内嵌 tgz
- 最小镜像与漏洞:distroless 或麒麟官方 minimal base、删除 gcc/python 等编译依赖、Trivy 国产漏洞库(CNNVD)扫描
- 非 root & 可信启动:容器内使用 65534 用户、seccomp 默认策略、cap-drop ALL、镜像签名(cosign+国密)
- 国产中间件替换:Notary 替换为支持国密的版本、helm chart 默认 storageclass 改为本地 nfs-client 国产版
- 构建加速:国内 GitHub 加速镜像、docker.io 反向代理(dockerproxy.com)、buildkit 并行编译缓存挂载
- 版本锁定:Dockerfile 中基础镜像 digest 锁定、go.sum/package-lock.json 一并入库,防止 CI 重新编译时哈希漂移
答案
在信创 ARM 环境编译 Harbor,我按“合规→依赖→构建→验证”四步落地:
-
合规先行
先确认 CPU 型号进入信创目录(如鲲鹏 920),操作系统使用麒麟 V10 SP2 ARM64 版,并检查内核是否已开启国密算法模块。将编译服务器加入信创工委会白名单,确保后续审计可追溯。 -
准备离线依赖
在一台可联网的同架构跳板机执行
docker buildx create --name arm64 --platform linux/arm64 --use
提前拉取registry.cn-hangzhou.aliyuncs.com/acs/mirror-golang:1.21-alpine-arm64、postgres:15-alpine-arm64、redis:7-alpine-arm64 等基础镜像,导出为 tar 后通过涉密光盘导入信创内网。
对 Harbor 源码执行
go mod vendor -e GOPROXY=https://goproxy.cn,direct
与
yarn config set cache-folder /offline/yarn-cache && yarn install --frozen-lockfile,把 vendor 与 yarn-offline-cache 一并打包,确保内网构建无下载。 -
多阶段构建
改写 Dockerfile.base,把第一阶段编译镜像改为
FROM golang:1.21-alpine-arm64 as builder
并加入
RUN apk add --no-cache gcc-aarch64-linux-gnu musl-dev
解决 CGO 交叉编译。
对 portal 前端阶段,使用
FROM node:18-alpine-arm64
并在 prebuild 执行
npm config set sharp_binary_host https://npmmirror.com/mirrors/sharp
避免 node-gyp 拉取 x86 二进包。
最终阶段使用麒麟官方 minimal 镜像
FROM kylin-minimal:10-arm64
并创建非 root 用户
RUN useradd -r -u 10000 harbor && chmod -R 755 /harbor。
整个构建命令:
docker buildx build --platform linux/arm64 --load -t harbor-arm64:v2.9.1 --build-arg BASEIMAGE=kylin-minimal:10-arm64 . -
验证与加固
使用Trivy 国产漏洞库离线扫描,确保无 HIGH 及以上 CVE;
用cosign 国密版对镜像签名,公钥存入银河麒麟可信密钥管理中心;
最后写docker-compose.arm64.yml,把默认网络改为macvlan 绑定国产交换机,volume 驱动指定华为 OceanStor 多路径 ARM 版,完成端到端信创交付。
拓展思考
如果面试官继续追问“如何在龙芯 LoongArch64 上编译 Harbor”,可回答:
LoongArch64 不在官方 Golang 支持列表,需要** LoongArch64 版 gccgo 或 patch 过的 Go1.21+,同时 Nodejs 需龙芯社区 18.18-loongarch64 移植版**;基础镜像只能使用统信 UOS LoongArch 版,且 PostgreSQL 必须降级到 13 并手动编译。此时应将 Harbor 拆分为纯 Go 组件(core、jobservice)与非纯 Go 组件(portal、registry)两条流水线,前者用 gccgo 编译,后者在龙芯物理机本地编译后 COPY 进镜像,最终通过manifest 合并成多服务栈。