使用 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] 为镜像文件名称
相关推荐
eight *3 小时前
docker部署elk+filebeat日志收集分析系统
elk·docker·容器
自己的九又四分之三站台4 小时前
docker安装pgvector、age和postgis
运维·docker·容器
幺零九零零5 小时前
Docker底层-IPC Namespace(进程间通信隔离)
运维·docker·容器
eddy-原6 小时前
ELKStack 与 Kubernetes 核心基础知识点综合作业
云原生·容器·kubernetes
V胡桃夹子6 小时前
Docker快速部署apollo
运维·docker·容器
oMcLin7 小时前
如何利用 Podman 替代 Docker:无 root 权限的容器管理实践
docker·dubbo·podman
程序员老赵8 小时前
ComfyUI Docker 镜像部署指南
人工智能·docker·aigc
会飞的土拨鼠呀9 小时前
Docker 部署开源蜜罐Cowrie
docker·容器·开源
我是谁??9 小时前
Rocky9.2离线安装docker和NVIDIA Container Toolkit训练环境搭建
运维·docker·容器
oMcLin9 小时前
如何在 Linux 上的 aaPanel 中使用 Docker 部署 WordPress 博客:从配置到上线一站式教程
linux·运维·docker