使用 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] 为镜像文件名称
相关推荐
zfj3213 小时前
Docker和容器OCI规范的关系
java·docker·eureka
qq_213059434 小时前
从零搭建企业级K8s集群
云原生·容器·kubernetes
NewBee_Lxx4 小时前
docker nginx
运维·docker·容器
乌云下的风5 小时前
Doker 学习 小册
docker
龙亘川7 小时前
【课程2.4】开发环境搭建:K8s集群部署、芋道框架集成、ThingsBoard对接
java·容器·kubernetes·智慧城市·智慧城市一网统管 ai 平台
AI云原生7 小时前
openEuler软件生态体验——从桌面到服务器的全方位探索
运维·服务器·windows·macos·docker·云计算·腾讯云
Empty_7777 小时前
K8S-Ingress资源对象
云原生·容器·kubernetes
robin59117 小时前
容器-汇总所有环境下的日志排查问题
linux·容器·kubernetes
weixin_46687 小时前
ks8核心组件、Pod分类、网络模型
云原生·容器·kubernetes