Ubuntu 22.04 AArch64 交叉编译 Docker 镜像构建指南
作者: (填写作者)
发布日期: 2025‑05‑26
1 背景与目标
在企业内网(需要代理)环境下,我们需要一套可靠、可复用的 Ubuntu 22.04 交叉编译镜像,用于 ARM64 (AArch64) 固件和内核构建。本文档从零梳理镜像构建全过程,并总结常见坑点与加固方案,便于团队后续快速复制实践。
2 目录结构
.
├── Dockerfile # 镜像构建文件
└── sources.list.tuna # 清华 Ubuntu 镜像源(HTTP/HTTPS 可选)
3 TUNA 源文件(sources.list.tuna
)
版本一定要用
jammy
(22.04),勿用bionic
(18.04)!
# 建议使用 HTTP,HTTPS 需先安装 ca-certificates
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
如需源码仓库或 proposed,请自行取消注释并添加 deb-src
/-proposed
。
4 Dockerfile(HTTPS 方案示例)
FROM ubuntu:22.04
ENV DEBIAN_FRONTEND=noninteractive \
LANG=C.UTF-8
# 1️⃣ 先更新官方源,安装 TLS 根证书
RUN apt-get update && \
apt-get install -y --no-install-recommends ca-certificates && \
rm -rf /var/lib/apt/lists/*
# 2️⃣ 覆盖为清华镜像并刷新索引
COPY sources.list.tuna /etc/apt/sources.list
RUN apt-get update
# 3️⃣ 安装交叉工具链与常用构建环境(已删 gcc‑multilib / g++‑multilib,gpgv 替代 gpgv2)
RUN apt-get install -y --no-install-recommends \
build-essential git openssh-client make \
gcc-aarch64-linux-gnu g++-aarch64-linux-gnu \
cpp-aarch64-linux-gnu binutils-aarch64-linux-gnu \
libssl-dev liblz4-tool libgmp-dev libmpc-dev \
libexpat1-dev libgucharmap-2-90-dev ncurses-dev \
bison flex fakeroot cmake unzip bc \
device-tree-compiler patchelf chrpath gawk texinfo diffstat \
qemu-user-static binfmt-support live-build \
expect lz4 gpgv python-is-python3 python2 \
&& apt-get clean && rm -rf /var/lib/apt/lists/*
# 4️⃣ 启用 qemu-aarch64(宿主内核支持时)
RUN update-binfmt --enable qemu-aarch64 || true
CMD ["/bin/bash"]
HTTP 方案:直接把
sources.list.tuna
中的https://
改为http://
,并删除第一阶段安装ca-certificates
的步骤即可。
5 构建与使用
5.1 构建镜像
# 推荐开启 BuildKit 提升速度
export DOCKER_BUILDKIT=1
docker build -t cross-aarch64:22.04 .
5.2 本地使用示例
# 映射当前源代码目录进入容器
docker run --rm -it -v "$(pwd)":/workspace cross-aarch64:22.04 bash
# 容器中编译内核示例
cd /workspace/linux-source
export CROSS_COMPILE=aarch64-linux-gnu-
make ARCH=arm64 defconfig
make -j$(nproc) ARCH=arm64
5.3 多平台构建(可选)
# 推送到私有 Harbor 并同时生成 x86_64/arm64 两架构镜像
docker buildx build --platform linux/amd64,linux/arm64 \
-t harbor.example.com/base/cross-aarch64:22.04 --push .
6 常见报错与排查
错误现象 | 根因 | 解决方案 |
---|---|---|
Certificate verification failed |
镜像源为 HTTPS,但镜像内无 ca-certificates |
先安装 ca-certificates 或改用 HTTP 源 |
gcc-multilib conflicts with gcc‑*-aarch64-linux-gnu |
两者互斥 | 删除 multilib 或使用多阶段 Dockerfile 分离 |
Package gpgv2 has no installation candidate |
22.04 已废弃 gpgv2 | 改装 gpgv 或 gnupg |
TLS handshake timeout |
公司代理或网络慢 | 在 apt 命令加 -o Acquire::Retries=3 -o Acquire::http::Timeout=30 |
7 最佳实践
- BuildKit 缓存:在 CI/CD 中使用
--cache-from
与共享缓存卷,显著减少二次构建耗时。 - 镜像瘦身:如果只需运行环境,使用多阶段将产物拷贝到
FROM scratch
或alpine
。 - 安全:尽量使用非 root 用户运行编译脚本;定期用
trivy
扫描漏洞。 - 代理:在公司代理环境,需同时配置 Docker daemon 与容器内部
apt
代理,避免 407 错误。 - 版本锁:给
Dockerfile
固定包版本 (e.g.gcc-aarch64-linux-gnu=11.*
) 以保证可重现性。
8 引用与参考
- Tsinghua Tuna 镜像站说明
- Ubuntu 22.04 Jammy 官方仓库
- Docker 官方 BuildKit 文档
- GNU Arm Embedded Toolchain (Ubuntu cross packages)
版权声明:本文档为原创,遵循 CC BY‑SA 4.0 协议;转载请注明出处。