1. 环境准备

1.1 租ARM云服务器

可以在阿里云租一个香港节点的ARM云服务器来执行,构建过程中需要从github等国外网站拉取资源。

1.2 环境检查

# 检查系统架构
uname -m
# 应输出:aarch64

# 检查Docker版本
docker --version

# 检查Docker Compose版本
docker compose version

# 检查必要工具
for tool in docker make curl wget git; do
    echo "Checking $tool: $(command -v $tool)"
done

2. 构建过程

2.1 准备源码

# 解压源码包
tar -xzf harbor-2.14.2.tar.gz
cd harbor-2.14.2

2.2 构建脚本

创建构建脚本 build-harbor-arm.sh

#!/bin/bash

# Harbor 2.14.2 ARM 架构构建脚本
# 适用于 Ubuntu ARM 环境

set -e

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
HARBOR_DIR="${SCRIPT_DIR}/harbor-2.14.2"

echo "========================================"
echo "Harbor 2.14.2 ARM 架构构建脚本"
echo "========================================"

# 检查是否在 ARM 环境下运行
ARCH=$(uname -m)
if [[ "$ARCH" != "aarch64" && "$ARCH" != "arm64" ]]; then
    echo "错误:本脚本仅在 ARM64 环境下运行"
    exit 1
fi

echo "检测到 ARM64 架构环境"

# 检查必要的工具
echo "检查必要的工具..."
MISSING_TOOLS=""
for tool in docker make curl wget git; do
    if ! command -v $tool &> /dev/null; then
        MISSING_TOOLS="${MISSING_TOOLS} ${tool}"
    fi
done

# 检查docker compose(支持v1和v2两种形式)
if ! command -v docker-compose &> /dev/null && ! docker compose version &> /dev/null; then
    MISSING_TOOLS="${MISSING_TOOLS} docker-compose"
fi

if [ -n "$MISSING_TOOLS" ]; then
    echo "错误:缺少工具:${MISSING_TOOLS}"
    echo "请安装缺失的工具后重新运行"
    exit 1
fi

echo "工具检查通过"

# 检查Docker是否运行
if ! docker info &> /dev/null; then
    echo "错误:Docker未运行或当前用户没有Docker权限"
    echo "请确保Docker已启动并当前用户有Docker访问权限"
    exit 1
fi

echo "Docker状态检查通过"

# 进入 Harbor 源码目录
cd "${HARBOR_DIR}" || {
    echo "错误:无法进入 ${HARBOR_DIR} 目录"
    exit 1
}

echo "已进入 Harbor 源码目录: $(pwd)"

echo "========================================"
echo "准备 ARM 特定工具"
echo "========================================"

# 下载ARM版本的spectral工具
SPECTRAL_VERSION="v6.10.0"
SPECTRAL_TOOL_PATH="${HARBOR_DIR}/tools/spectral"

if [ ! -f "${SPECTRAL_TOOL_PATH}/spectral" ]; then
    echo "下载 ARM 版本的 spectral 工具..."
    mkdir -p "${SPECTRAL_TOOL_PATH}"
    curl -fSL "https://github.com/stoplightio/spectral/releases/download/${SPECTRAL_VERSION}/spectral-linux-arm64" \
        -o "${SPECTRAL_TOOL_PATH}/spectral" || {
        echo "警告:spectral工具下载失败,将使用Docker镜像替代"
    }
    if [ -f "${SPECTRAL_TOOL_PATH}/spectral" ]; then
        chmod +x "${SPECTRAL_TOOL_PATH}/spectral"
        echo "spectral 工具准备完成"
    fi
else
    echo "spectral 工具已存在"
fi

echo "========================================"
echo "设置 ARM 架构构建环境变量"
echo "========================================"

# ARM 特定的环境变量
export BUILD_BASE=true
export PULL_BASE_FROM_DOCKERHUB=false
export DEVFLAG=true
export BUILD_INSTALLER=true
export VERSIONTAG=dev

# ARM 架构特定的构建参数
export GOARCH=arm64
export BASEIMAGETAG=arm64
export BUILDX_PLATFORM=linux/arm64

# Go编译参数
export CGO_ENABLED=1
export GOOS=linux

echo "环境变量设置完成"
echo "- BUILD_BASE: ${BUILD_BASE}"
echo "- PULL_BASE_FROM_DOCKERHUB: ${PULL_BASE_FROM_DOCKERHUB}"
echo "- DEVFLAG: ${DEVFLAG}"
echo "- BUILD_INSTALLER: ${BUILD_INSTALLER}"
echo "- VERSIONTAG: ${VERSIONTAG}"
echo "- GOARCH: ${GOARCH}"
echo "- BASEIMAGETAG: ${BASEIMAGETAG}"
echo "- BUILDX_PLATFORM: ${BUILDX_PLATFORM}"

echo "========================================"
echo "验证基础镜像"
echo "========================================"

# 验证ARM基础镜像是否存在
PHOTON_BASE_IMAGE="photon:5.0"
if docker images "${PHOTON_BASE_IMAGE}" --format "{{.Repository}}:{{.Tag}}" 2>/dev/null | grep -q "${PHOTON_BASE_IMAGE}"; then
    echo "基础镜像 ${PHOTON_BASE_IMAGE} 已存在"
else
    echo "注意:基础镜像 ${PHOTON_BASE_IMAGE} 不存在,构建时将自动拉取"
    echo "如果是ARM版本,请确保镜像支持ARM64架构"
fi

echo "========================================"
echo "清理旧的构建产物"
echo "========================================"

# 清理旧的构建产物
make cleanall || true
echo "清理完成"

echo "========================================"
echo "生成版本文件"
echo "========================================"

# 生成versions文件
make versions_prepare
echo "versions文件生成完成"

echo "========================================"
echo "编译核心组件 (ARM 版本)"
echo "========================================"

# 编译核心组件,指定ARM架构
make compile_core

echo "core 组件编译完成"

make compile_jobservice
echo "jobservice 组件编译完成"

make compile_registryctl
echo "registryctl 组件编译完成"

make compile_standalone_db_migrator
echo "standalone-db-migrator 组件编译完成"

echo "所有核心组件编译完成"

echo "========================================"
echo "构建 Docker 镜像 (ARM 版本)"
echo "========================================"

# 构建镜像,指定ARM参数
make build \
    -e BASEIMAGETAG=${BASEIMAGETAG} \
    -e BUILDX_PLATFORM=${BUILDX_PLATFORM} \
    -e BUILD_BASE=${BUILD_BASE} \
    -e PULL_BASE_FROM_DOCKERHUB=${PULL_BASE_FROM_DOCKERHUB} \
    -e DEVFLAG=${DEVFLAG} \
    -e BUILD_INSTALLER=${BUILD_INSTALLER} \
    -e VERSIONTAG=${VERSIONTAG}

echo "镜像构建完成"

echo "========================================"
echo "准备配置文件"
echo "========================================"

# 复制并准备配置文件
if [ -f "${HARBOR_DIR}/make/harbor.yml.tmpl" ]; then
    cp "${HARBOR_DIR}/make/harbor.yml.tmpl" "${HARBOR_DIR}/harbor.yml"
    echo "配置文件已生成:harbor.yml"
    echo "请编辑 harbor.yml 文件配置您的 Harbor 实例"
else
    echo "警告:找不到配置文件模板 harbor.yml.tmpl"
fi

echo "========================================"
echo "打包离线安装包"
echo "========================================"

# 打包离线安装包
make package_offline \
    -e BASEIMAGETAG=${BASEIMAGETAG} \
    -e VERSIONTAG=${VERSIONTAG} \
    -e DEVFLAG=${DEVFLAG} \
    -e PULL_BASE_FROM_DOCKERHUB=false \
    -e BUILD_BASE=true

echo "离线安装包打包完成"

echo "========================================"
echo "构建完成"
echo "========================================"

# 显示构建结果
echo ""
echo "构建结果文件:"
ls -lh "${SCRIPT_DIR}"/harbor-offline-installer-*.tgz 2>/dev/null || echo "未找到离线安装包"

echo ""
echo "构建的 Docker 镜像:"
docker images | grep -E "harbor|goharbor" || echo "未找到 Harbor 相关镜像"

echo ""
echo "========================================"
echo "Harbor 2.14.2 ARM 版本构建成功!"
echo "========================================"
echo ""
echo "安装说明:"
echo "1. 解压离线安装包:tar -xzf harbor-offline-installer-${VERSIONTAG}.tgz"
echo "2. 进入解压目录:cd harbor"
echo "3. 编辑配置文件:vim harbor.yml"
echo "4. 运行安装:sudo ./install.sh"
echo ""
echo "或者直接使用 docker-compose 启动:"
echo "   docker-compose up -d"
echo ""
echo "访问 Harbor Web 界面:http://hostname:8080"
echo "默认管理员账号:admin"
echo "默认管理员密码:Harbor12345"
echo "========================================"

2.3 执行构建

# 给脚本添加执行权限
chmod +x build-harbor-arm.sh

# 执行构建
./build-harbor-arm.sh

2.4 构建过程中的关键步骤

  1. 环境检查:验证ARM64架构和必要工具
  2. 工具准备:下载ARM版本的spectral工具
  3. 核心组件编译:编译core、jobservice、registryctl、standalone-db-migrator
  4. Docker镜像构建:构建所有ARM64版本的组件镜像
  5. 离线安装包打包:生成完整的离线安装包

3. 安装说明

3.1 解压安装包

# 解压离线安装包
tar -xzf harbor-offline-installer-dev.tgz
cd harbor

3.2 配置 Harbor

编辑 harbor.yml 配置文件:

# 基本配置
hostname: your-hostname

# HTTP 配置
http:
  port: 8080

# HTTPS 配置(可选)
# https:
#   port: 443
#   certificate: /path/to/cert.crt
#   private_key: /path/to/private.key

# 数据存储
data_volume: /data

# 日志配置
log:
  level: info
  rotate_count: 50
  rotate_size: 200M
  location: /var/log/harbor

# 认证配置
auth:
  mode: db_auth
  db_auth:
    username: root
  ldap_auth:
    # LDAP 配置(可选)

#  Harbor 管理员密码
harbor_admin_password: Harbor12345

# 数据库配置
database:
  password: root123
  max_idle_conns: 50
  max_open_conns: 100

# Redis 配置
redis:
  host: redis
  port: 6379
  password: 
  db_index: 1

# 存储配置
storage_service:
  provider_name: filesystem
  filesystem:
    rootdirectory: /data/registry

# 扫描器配置
scanner:
  name: Trivy
  url: http://trivy-adapter:8080
  adapter:
    enabled: true
  api:
    timeout: 5m

# 其他配置
jobservice:
  max_job_workers: 10
chart:
  absolute_url: disabled
notary:
  enabled: false
trivy:
  ignore_unfixed: false
  skip_update: false
  offline_scan: false
  security_check: vuln
  secret: []
  java_db_driver_path: /usr/lib/jvm/java-11-openjdk-11.0.11.0.9-2.ph4.aarch64/lib/postgresql-42.2.18.jar

3.3 安装 Harbor

# 运行安装脚本
sudo ./install.sh

3.4 启动/停止 Harbor

# 启动 Harbor
docker compose up -d

# 停止 Harbor
docker compose down

# 重启 Harbor
docker compose restart

3.5 卸载 Harbor

# 停止并移除 Harbor 容器
cd harbor
docker compose down -v

# 清理 Harbor 数据和配置
rm -rf /data/harbor  # 对应 harbor.yml 中的 data_volume 配置
rm -rf /var/log/harbor  # 对应 harbor.yml 中的 log.location 配置

# 清理 Harbor 镜像
docker images --format '{{.Repository}} {{.ID}}' | grep '^goharbor/' | awk '{print $2}' | xargs -r docker rmi -f

# 清理 Harbor 相关网络
docker network prune -f

# 清理 Harbor 相关卷
docker volume prune -f

3.6 访问 Harbor

  • Web 界面http://your-hostname:8080
  • 默认账号admin
  • 默认密码Harbor12345

4. 总结

Harbor 2.14.2 在 ARM64 架构下的构建和安装过程与 x86 架构基本相同,主要区别在于:

  1. 架构指定:通过环境变量指定 ARM64 架构
  2. 基础镜像:使用支持 ARM64 的基础镜像
  3. 工具准备:下载 ARM 版本的构建工具
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐