[X3容器应用开发探索-1]使用Rootfs制作Docker镜像

目录

前言-
一、制作镜像-
方式1-在根文件系统目录下制作镜像-
方式2-使用根文件系统压缩包制作镜像-
二、本地导出、导入镜像-
1、导出为tar文件-
2、从tar包中导入镜像-
3、导出为tar.gz压缩包-
4、导入tar.gz压缩包-

前言

rdk-gen可以用来构建系统镜像,在使用pack_image.sh在完成构建后。deploy/rootfs路径下还存放着固件的根文件系统,可以通过chroot使用:

根文件系统中已经包含qemu-static,能被chroot挂载。意味着这个根文件系统可以用于制作成docker镜像。

文中用到的的docker命令:

docker build : 根据Dockerfile内容制作镜像

docker run: 使用镜像创建Docker容器并立刻运行

对镜像使用saveload,对容器使用exportimport

docker save: 将镜像导出(默认情况式传输到 STDOUT)

docker load: 从tar或STDIN中导入镜像

docker ps:列出容器(运行中的)

docker ps -a:列出所有容器

docker images:列出镜像

docker rm:删除容器

docker rmi:删除镜像

一、制作镜像

为了制作和使用docker容器至少需要安装 docker-compose软件包。-

方式1-在根文件系统目录下制作镜像

在根文件系统中创建一个Dockerfile输入以下内容,制作一个新镜像:

FROM scratch
ADD . /

在根文件系统目录下使docker build将其导入为docker镜像:

#格式: docker build -t <image-name> .
docker build -t x3rootfs .

随后可以通过docker run创建一个用后就销毁的容器进行简单测试,在容器中输入exit可以退出容器。

sudo docker run -it --rm x3rootfs /bin/bash

补充:删除容器

如果没有加上--rmexit退出后容器不会被销毁。可以使用docker ps -a列出所有容器,再用docker rm <容器id>将其销毁。

使用qemu仿真环境运行docker容器

参考文档Multi-platform images,如果主机和容器都配置好了qemu环境可以直接使用镜像,不需要借助docker内置的qemu-static;

但在生产环境下不推荐使用仿真环境,Qemu模拟AArch64架构会造成难以容忍的性能损失。

  • 根据Qemu转译Armv8-a性能基准测试结果,6253CL 3.7Ghz在仿真环境下单核性能低于X3Pi A53 1.2Ghz,严重影响构建速度。不推荐将Qemu用于仿真性能高于Cortex-A7的平台。-

方式2-使用根文件系统压缩包制作镜像

这种方式比较适合CI与二次分发。

开发环境:

先将根文件系统打包成名称为 rootfs.tar.xz的压缩包

#./rdk-gen/deploy
sudo tar zcvf rootfs.tar.xz -C rootfs .
sudo chmod 777 rootfs.tar.xz

部署与测试环境(RPI4):

创建一个目录用于存放 rootfs.tar.xz

同级在目录下创建一个Dockerfile输入以下内容:

FROM scratch
ADD rootfs.tar.xz /
CMD ["/bin/bash"]

同样使用docker build 将压缩包导入为镜像

docker build -t x3rootfs .

执行结果如下图所示

创建一个CI中常见的用后就销毁的容器:

sudo docker run -it --rm x3rootfs /bin/bash

编译multimedia_samples/sample_lcd:

在AArch64设备上运行docker容器

X3 rootfs制作的根文件系统在树莓派4的docker中性能表现良好

二、本地导出、导入镜像

1、导出为tar文件

制作完镜像后可以将其导出供其他设备使用。

docker images列出已有镜像

docker save -o x3rootfs.tar x3rootfs将x3rootfs镜像导出到x3rootfs.tar这一文件中。

2、从tar包中导入镜像

为了演示方便在同一台设备上进行导入,先使用docker rmi x3rootfs删除先前的x3rootfs镜像。

也可以使用docker rmi <image id>删除镜像

接下来使用docker load -i x3rootfs.tar从文件中导入镜像

3、导出为tar.gz压缩包

大多数情况下tar导出就能满足需求,但这是一个根文件系统镜像,体积太大。save除了能将其输出到文件中也能将其输入STDOUT,通过管道传递给其他程序。

参考官方的示例

Save an image to a tar.gz file using gzip

You can use gzip to save the image file and make the backup smaller.

$ docker save myimage:latest | gzip > myimage_latest.tar.gz

可以使用 docker save x3rootfs | gzip > x3rootfs.tar.gz在导出时用gzip减小体积:

4、导入tar.gz压缩包

在本节的第二部分中使用了docker -i导入了x3rootfs.tar。

此处还可以使用 docker load < x3rootfs.tar.gz 从STDIN导入文件: