使用 Docker 搭建全志 SDK 编译构建环境

前言

最近负责在几套全志 SDK 上进行相关驱动和应用开发工作,有些 SDK 版本较老,有些 SDK 版本较新,而编译机器只有一台,为了解决在同一机器上进行不同 SDK 的编译环境,于是研究了 Docker 相关技术,并最终实现了想要的效果,就有了这篇文章。

相信大家多多少少都听过 Docker,并且现在 AI 也很方便能查到相关概念解释,关于 Docker 的介绍我在这里就不赘述了,直接上干货!

Dockerfile 怎么写?

Dockerfile 用于构建镜像,之后用构建的镜像来启动容器,就可以达到根文件系统的模拟效果。

下面我列出了一些常用的 Dockerfile 指令:

FROM:指定基础镜像

dockerfile 复制代码
FROM ubuntu:22.04
FROM node:18-alpine AS builder

RUN:执行命令并创建新层

dockerfile 复制代码
RUN apt-get update && apt-get install -y nginx
RUN npm install

CMD:容器启动时的默认命令(可被覆盖)

dockerfile 复制代码
CMD ["nginx", "-g", "daemon off;"]
CMD npm start

ENTRYPOINT:容器启动时的入口点(不可被覆盖)

dockerfile 复制代码
ENTRYPOINT ["docker-entrypoint.sh"]
ENTRYPOINT ["/bin/sh", "-c"]

COPY:复制文件到镜像

dockerfile 复制代码
COPY package.json /app/
COPY --chown=nginx:nginx . /app

ADD:复制文件并支持 URL 和自动解压

dockerfile 复制代码
ADD https://example.com/file.tar.gz /app/
ADD archive.tar.gz /app/

WORKDIR:设置工作目录

dockerfile 复制代码
WORKDIR /app

ENV:设置环境变量

dockerfile 复制代码
ENV NODE_ENV=production
ENV PATH=/app/bin:$PATH

ARG:定义构建参数

dockerfile 复制代码
ARG VERSION=1.0
RUN echo "Building version $VERSION"

EXPOSE:声明容器监听端口

dockerfile 复制代码
EXPOSE 80
EXPOSE 443/tcp

VOLUME:定义匿名卷

dockerfile 复制代码
VOLUME /data

USER:指定运行用户

dockerfile 复制代码
USER nginx

LABEL:添加元数据

dockerfile 复制代码
LABEL version="1.0"
LABEL maintainer="admin@example.com"

HEALTHCHECK:健康检查

dockerfile 复制代码
HEALTHCHECK --interval=30s --timeout=3s \
  CMD curl -f http://localhost/ || exit 1

SHELL:指定默认 shell

dockerfile 复制代码
SHELL ["/bin/bash", "-c"]

Tina vs Longan

Tina SDK 基于 OpenWrt 深度定制,而 Longan SDK 基于 Buildroot 深度定制,以下是它们的对比:

特性 Tina Linux Longan Linux
基础架构 OpenWrt Buildroot (通常)
构建方式 make menuconfig (OpenWrt style) ./build.sh config (Allwinner style)
C 标准库 Musl (默认), Glibc Glibc (默认)
启动速度 极快 (秒级) 一般 (标准 Linux 速度)
内存开销 极低 (适合 < 128MB RAM) 较高 (建议 > 256MB RAM)
进程通信 ubus DBus, Socket, 共享内存等标准方式
图形界面 适合轻量级 (MiniGUI, LVGL) 适合重量级 (Qt, Wayland)
学习曲线 需了解 OpenWrt 框架 需了解标准 Linux/Buildroot
典型应用 智能家居、音箱、简单 IPC 工控屏、平板类、复杂网关

下面分别给出它们的 Dockerfile 内容,这些镜像都是我验证过了,可以成功编译 SDK。

Tina SDK Dockerfile

dockerfile 复制代码
FROM ubuntu:14.04

# 安装编译工具及 SDK 依赖
RUN apt update && apt install build-essential subversion git-core libncurses5-dev zlib1g-dev gawk flex quilt libssl-dev xsltproc libxml-parser-perl mercurial bzr ecj cvs unzip lib32z1 lib32z1-dev lib32stdc++6 libstdc++6 -y

RUN apt install bc busybox wget -y

# 设置工作目录
WORKDIR /workspace

# 设置默认命令
CMD ["/bin/bash"]

Longan SDK Dockerfile

dockerfile 复制代码
FROM ubuntu:20.04

# 设置时区为上海
ENV TZ=Asia/Shanghai \
    DEBIAN_FRONTEND=noninteractive

RUN apt update \
    && apt install -y tzdata \
    && ln -fs /usr/share/zoneinfo/${TZ} /etc/localtime \
    && echo ${TZ} > /etc/timezone \
    && dpkg-reconfigure --frontend noninteractive tzdata \
    && rm -rf /var/lib/apt/lists/*

# 安装编译工具及 SDK 依赖
RUN apt update \
    && apt install -y \
        build-essential \
        g++-multilib \
        libelf-dev \
        bc \
        kmod \
        make \
        cmake \
        cpio \
        flex \
        bison \
        libssl-dev \
        libncurses5-dev \
        pkg-config \
        libc6-dev \
        bzip2 \
        rsync \
        libncurses-dev \
        file \
        wget \
        unzip \
        busybox \
        git \
        curl \
        vim \
        valgrind \
        python \
        python3 \
        python3-matplotlib \
        python3-numpy \
        python-markdown \
        autoconf automake autotools-dev libtool m4 perl gettext \
        gnupg \
        zip \
        gperf \
        libxml2-utils \
        xsltproc \
        gawk \
        dos2unix \
        tofrodos \
        libicu-dev \
        texinfo \
        patch \
        iputils-ping \
        graphviz

# 设置工作目录
WORKDIR /workspace

# 设置默认命令
CMD ["/bin/bash"]

构建镜像

运行如下命令:

c 复制代码
docker build -t build_sdk .

运行容器

sh 复制代码
sudo docker run -it \
  --name build_sdk \
  -v /home/leon/longan_sdk:/workspace \
  -w /workspace \
  build_sdk \
  /bin/bash
  • /home/leon/longan_sdk 为你的 sdk 目录
  • build_sdk 为容器名称

之后,在容器里面运行 ./build.sh 就可以愉快的进行构建了

后面不管是切换到哪个编译机器,都不用担心因为编译环境不同导致编译失败的问题了~

如果大家构建镜像失败(需要科学上网),我这里提供了现成的镜像文件:

链接: https://pan.baidu.com/s/1F_bgGWruCTx4uD1jayFkZw?pwd=wp84 提取码: wp84

下载后运行:

复制代码
docker load -i [file.tar]
  • [file.tar] 为镜像文件名称
相关推荐
70asunflower9 小时前
用Docker创建不同的容器类型
运维·docker·容器
小Pawn爷10 小时前
3.Dockerfile
docker
CodeGolang10 小时前
Docker容器化部署Zabbix监控系统完整指南
docker·容器·zabbix
忆~遂愿10 小时前
Runtime 上下文管理:计算实例的生命周期、延迟最小化与上下文切换优化
java·大数据·开发语言·人工智能·docker
lpruoyu20 小时前
【Docker进阶-03】存储原理
docker·容器
文静小土豆21 小时前
Docker 与 containerd 代理配置详解:镜像拉取速度慢的终极解决方案
运维·docker·容器
JY.yuyu1 天前
Docker常用命令——数据卷管理 / 端口映射 / 容器互联
运维·docker·容器
lpruoyu1 天前
【Docker进阶-06】docker-compose & docker swarm
运维·docker·容器
虾说羊1 天前
docker容器化部署项目流程
运维·docker·容器
骇客野人1 天前
通过脚本推送Docker镜像
java·docker·容器