大部分时候(使用的是 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
构建一个别家系统的基础镜像
-
确定软件源(loongarch64) deb https://education-packages.chinauos.com/desktop-education uranus/dc80 main
-
开始构建(同架构下的debootstrap用同样的方法应该已经安装好了)
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 包被卸载。