前言
最近负责在几套全志 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]为镜像文件名称