自建一个系统的基础镜像

大部分时候(使用的是 x86 架构),已经有很多官方的 基础docker镜像 供我们使用了。 某些时候(非 x86 架构,或者使用的特殊linux发行版),我们会需要打一个当前系统的 基础docker镜像 来做开发或编译环境的保存。这里就是介绍一次如何自建一个当前系统的基础镜像。

操作

lnks@lnks:~$ cat /etc/apt/sources.list
## Generated by deepin-installer
deb http://sh-packages.chinauos.com/desktop-professional/1040  eagle/sp4 main contrib non-free
lnks@lnks:~$ sudo apt install debootstrap
lnks@lnks:~$ sudo debootstrap eagle/sp4 rootfs http://sh-packages.chinauos.com/desktop-professional/1040 sid
I: Can t verify that target arch works
I: Retrieving InRelease
I: Checking Release signature
E: Release signed by unknown key (key id 243A16C859595D31)
   The specified keyring /usr/share/keyrings/debian-archive-keyring.gpg may be incorrect or out of date.
   You can find the latest Debian release key at https://ftp-master.debian.org/keys.html
lnks@lnks:~$ sudo debootstrap --no-check-gpg eagle/sp4 rootfs http://sh-packages.chinauos.com/desktop-professional/1040 sid
lnks@lnks:~$ sudo chroot rootfs/
sudo rm rootfs/var/log/bootstrap.log
sudo rm -rf rootfs/var/log/*
sudo rm rootfs/var/log/apt/*
lnks@lnks:~$ sudo su
lnks@lnks:~$ tar -C rootfs/ -c . | docker import -
lnks@lnks:~$ docker tag 259ce466a72d3d4c35c203d7912b7067ef4b1f85c1fdcc27aa1a0d0cd7afe4a9 registry.linakesi.com/uos:eagle-sp4
lnks@lnks:~$ docker push registry.linakesi.com/uos:eagle-sp4

# sudo debootstrap focal focal > /dev/null
# sudo tar -C focal -c . | docker import - focal
# dpkg -l |grep "^rc"|awk '{print $2}' |xargs aptitude -y purge

测试镜像

lnks@lnks:~$ sudo docker run -it --rm registry.linakesi.com/uos:eagle-sp4 bash
lnks@lnks:~$ apt purge dmidecode
lnks@lnks:~$ apt purge man-db
lnks@lnks:~$ ldd --version

别的方式

# syntax=docker/dockerfile:1
FROM scratch
ADD hello /
CMD ["/hello"]
FROM scratch
ARG TARGETARCH
ARG dir
ARG SUITE
ADD rootfs/$dir/$TARGETARCH/$SUITE/rootfs.tar.xz /
CMD ['bash']
FROM alpine:3.10
ADD bigfile.tar.xz /tmp/
# https://docs.docker.com/engine/reference/commandline/build/
docker build http://server/context.tar.gz
docker build -f ctx/Dockerfile http://server/ctx.tar.gz
docker build - < Dockerfile
docker build - < context.tar.gz

构建一个别家系统的基础镜像

sudo debootstrap --no-check-gpg uranus/dc80 rootfs https://education-packages.chinauos.com/desktop-education sid
# 需要确保当前路径下 不存在 rootfs 目录 或者只有 空的 rootfs 目录。
sudo du --human-readable --summarize rootfs
391M    rootfs/

# 我这里省略了下面的步骤
# sudo mount --bind /dev     rootfs/dev
# sudo mount --bind /dev/pts rootfs/dev/pts
# sudo mount --bind /proc    rootfs/proc
# sudo mount --bind /sys     rootfs/sys


sudo chroot rootfs/

apt-get remove --allow-remove-essential e2fsprogs e2fslibs nano pinentry-curses whiptail kmod iptables iproute2 dmidecode
apt-get clean
find /var/lib/apt/lists/ -maxdepth 2 -type f -delete
exit

# 因为先前没有挂载,所以我也不用做这个步骤
# sudo umount rootfs/dev/pts
# sudo umount rootfs/dev
# sudo umount rootfs/proc
# sudo umount rootfs/sys

sudo du --human-readable --summarize rootfs
203M    rootfs/

sudo rm rootfs/var/log/bootstrap.log
sudo rm -rf rootfs/var/log/*
sudo rm rootfs/var/log/apt/*

sudo du --human-readable --summarize rootfs
203M    rootfs/

sudo su
tar -C rootfs/ -c . | docker import -
docker tag 259ce466a72d3d4c35c203d7912b7067ef4b1f85c1fdcc27aa1a0d0cd7afe4a9 registry.linakesi.com/uos-edu-desktop:loongarch64
  • 测试使用
docker run --rm -it registry.linakesi.com/uos-edu-desktop:loongarch64 bash
apt install git
# 测试成功
# 后续使用中如果有问题,考虑从 apt-get remove 操作中找原因,比如我发现执行 remove 时有 deepin-keyring 包被卸载。