Stage 1: base OS (apt sources, packages, user creation)
Stage 2: dev tools (cmake, gdb, CUDA, OpenCV, Node.js)
Stage 3: SDK init (git, symlinks, helper scripts)
Stage 4: env config (proxy, profile variables)
Stage 5: workspace + entrypoint + smoke tests
Stage 1: base OS (apt sources, packages, user creation)
Stage 2: dev tools (cmake, gdb, CUDA, OpenCV, Node.js)
Stage 3: SDK init (git, symlinks, helper scripts)
Stage 4: env config (proxy, profile variables)
Stage 5: workspace + entrypoint + smoke tests
Stage 1: base OS (apt sources, packages, user creation)
Stage 2: dev tools (cmake, gdb, CUDA, OpenCV, Node.js)
Stage 3: SDK init (git, symlinks, helper scripts)
Stage 4: env config (proxy, profile variables)
Stage 5: workspace + entrypoint + smoke tests
CLIENT_SSH_PORT = 2109 + PORT_SLOT × 10
GDB_PORT = 2345 + PORT_SLOT × 10
CLIENT_SSH_PORT = 2109 + PORT_SLOT × 10
GDB_PORT = 2345 + PORT_SLOT × 10
CLIENT_SSH_PORT = 2109 + PORT_SLOT × 10
GDB_PORT = 2345 + PORT_SLOT × 10
Layer 1: configs/defaults/*.env ← global defaults (10 domain-scoped files)
Layer 2: configs/common.env ← project version & constants
Layer 3: configs/platforms/*.env ← per-platform overrides (≤20 lines)
Layer 1: configs/defaults/*.env ← global defaults (10 domain-scoped files)
Layer 2: configs/common.env ← project version & constants
Layer 3: configs/platforms/*.env ← per-platform overrides (≤20 lines)
Layer 1: configs/defaults/*.env ← global defaults (10 domain-scoped files)
Layer 2: configs/common.env ← project version & constants
Layer 3: configs/platforms/*.env ← per-platform overrides (≤20 lines)
# configs/platforms/rk3568-rk3568_ubuntu-20.04.env
PRODUCT_NAME="rk3568-rk3568_ubuntu-20-04"
CHIP_FAMILY="rk3568"
OS_VERSION="20.04"
OS_VERSION_ID="20-04"
PORT_SLOT=2
HOST_VOLUME_DIR="/mnt/disk/volumes/rk3568"
HAS_PROXY=true
HTTP_PROXY_IP="192.168.3.152"
# configs/platforms/rk3568-rk3568_ubuntu-20.04.env
PRODUCT_NAME="rk3568-rk3568_ubuntu-20-04"
CHIP_FAMILY="rk3568"
OS_VERSION="20.04"
OS_VERSION_ID="20-04"
PORT_SLOT=2
HOST_VOLUME_DIR="/mnt/disk/volumes/rk3568"
HAS_PROXY=true
HTTP_PROXY_IP="192.168.3.152"
# configs/platforms/rk3568-rk3568_ubuntu-20.04.env
PRODUCT_NAME="rk3568-rk3568_ubuntu-20-04"
CHIP_FAMILY="rk3568"
OS_VERSION="20.04"
OS_VERSION_ID="20-04"
PORT_SLOT=2
HOST_VOLUME_DIR="/mnt/disk/volumes/rk3568"
HAS_PROXY=true
HTTP_PROXY_IP="192.168.3.152"
./harbor
# Interactive: pick platform → build → tag → push to Harbor → verify manifest digest
./harbor
# Interactive: pick platform → build → tag → push to Harbor → verify manifest digest
./harbor
# Interactive: pick platform → build → tag → push to Harbor → verify manifest digest
./ubuntu_only_entrance.sh start
./ubuntu_only_entrance.sh start
./ubuntu_only_entrance.sh start
./scripts/create_platform.sh --non-interactive \ --name rk3566-debian12 --os debian --os-version 12 \ --harbor-ip 192.168.3.68 --port-slot 6
./scripts/create_platform.sh --non-interactive \ --name rk3566-debian12 --os debian --os-version 12 \ --harbor-ip 192.168.3.68 --port-slot 6
./scripts/create_platform.sh --non-interactive \ --name rk3566-debian12 --os debian --os-version 12 \ --harbor-ip 192.168.3.68 --port-slot 6 - Five different Dockerfiles, diverging more with every Ubuntu release
- Port collisions when running containers for multiple platforms at the same time
- Ubuntu 24.04 broke your apt mirror setup, pip installs, and UID assignments all at once
- Image push to Harbor requires glue scripts nobody maintains - DEB822 apt format — /etc/apt/sources.list is deprecated
- UID 1000 pre-occupied — the default ubuntu user already has it
- PEP 668 — pip install now refuses without --break-system-packages - GitHub: potterwhite/HarborPilot (MIT)
- AI agent docs — codebase map and working rules for LLM coding agents
- Current supported platforms: RK3588/RK3588S, RV1126/RV1126bp, RK3568 on Ubuntu 20.04/22.04/24.04