构建Ubuntu unminimized的docker镜像
前言
最近需要回顾一下Linux环境的Bash命令。使用 Docker 是快速搭建 Linux 环境的最佳方式,只需运行以下命令即可获取并启动一个 Ubuntu 容器:
docker pull ubuntu
docker run -it ubuntu
然而,Docker Hub 提供的官方 Ubuntu 镜像是一个最小化版本(minimized version)。该镜像专为应用程序部署设计,仅包含必要的运行文件,删除了许多用于交互的软件包。例如,当运行 man 命令时,会提示:
This system has been minimized by removing packages and content that are not required on a system that users do not log into.
To restore this content, you can run the ‘unminimize’ command.
root@6ac67a73f171:/# man man
This system has been minimized by removing packages and content that are
not required on a system that users do not log into.
To restore this content, including manpages, you can run the ‘unminimize’
command. You will still need to ensure the ‘man-db’ package is installed
为了提升交互体验,我们将在官方 Ubuntu 最小镜像的基础上,安装必要的软件包,构建一个可用于日常操作的 Ubuntu 镜像。
使用dockerfile
Dockerfile内容如下:
ARG TAG
From ubuntu:$TAG# set up DEBIAN_FRONTEND to avoid configuring tzdata
ENV DEBIAN_FRONTEND noninteractive# 运行unminimize命令
RUN apt-get update && apt-get install -y unminimize && yes | unminimize # 安装以下文件包:
# - vim编辑文件
# - man命令使用指南
# - iproute2 is the modern replacement for the old net-tools package and is the standard for network management in modern Linux distributions. It includes commands eg. ss, ip
# - netcat
# - python v3
RUN apt-get install -y vim man curl iproute2 netcat-openbsd python3WORKDIR /home/ubuntu
CMD ["bash"]
构建docker image
docker buildx build命令支持构建多平台的docker镜像,并可以上传至docker hub:
# 登陆docker hub
docker login
# 构建并上传到docker hub的仓库中。
# 如果不想使用多平台支持,可以直接使用docker build命令。或者去掉--platform参数。
# 如果不想上传镜像,直接去掉--push参数。
docker buildx build -f Dockerfile --platform "linux/amd64,linux/arm64" -t liyane/ubuntu-unminimized:24.04 --build-arg TAG=24.04 --push .
使用docker image
你可以创建自己的dockerfile和docker image,或者直接拉取我上传在Docker Hub中的docker image(已设置为公开)。
下面的截图是我上传到docker hub上的镜像截图:
使用以下的命令,获取并启动容器。
# 从docker hub拉取镜像
docker pull liyane/ubuntu-unminimized:24.04
# 启动容器,容器自动启动/bin/bash,并占领当前会话窗口。Ctrl+C退出后,容器进程将处于停止状态。
docker run -it liyane/ubuntu-unminimized:24.04
也可以使用以下的命令,在后台模式下启动和使用容器。
docker run -d liyane/ubuntu-unminimized:24.04
# 进入正在运行的容器,执行bash命令
docker exec -it $(docker ps -qf "ancestor=liyane/ubuntu-unminimized:24.04") bash
持续集成(CI)
我在GitHub Actions中创建了一个workflow,可以自动构建和上传docker image。
欢迎访问我的Github repo: lisaliyane/ubuntu-unminimized
。
参考
- Docker hub Ubuntu: https://hub.docker.com/_/ubuntu
- Mininal Ubuntu Wiki page: https://wiki.ubuntu.com/Minimal
- Przemub’s Github repo: https://github.com/przemub/ubuntu-unminimized
备注
备注1: 与参考3的关系
参考3是非常好的范例。我在手动构建和上传docker镜像之后,看到作者的这个repo,非常惊喜,因为作者有类似的功能,而且使用Github Actions workflow非常好的实现了CI。既然有现成的平台和示例代码,为什么不创建一个自己的仓库和CI呢?
我借鉴了作者的代码,并作出以下修改:
- build.sh脚本中,简化了字符串处理方式。
- Dockerfile中,不安装 ubuntu-server,而是仅安装我需要的软件包。
- workflow中,调整 Workflow 的触发条件和日志记录。
备注2: 为什么不直接安装ubuntu-server?
unbuntu-server包括太多的安装包,为保持轻量化,我们选择只安装必要的软件包。
The apt install ubuntu-server -y
packages list:
The following NEW packages will be installed:
adduser apparmor apport apport-core-dump-handler apport-symptoms appstream bc bcache-tools bolt btrfs-progs busybox-initramfs byobu ca-certificates cloud-guest-utils cloud-initramfs-copymods
cloud-initramfs-dyn-netconf console-setup console-setup-linux cpio cryptsetup cryptsetup-bin cryptsetup-initramfs curl dbus dbus-bin dbus-daemon dbus-session-bus-common dbus-system-bus-common
dbus-user-session dhcpcd-base dirmngr distro-info distro-info-data dmeventd dmsetup dosfstools dracut-install eject ethtool fdisk finalrd fonts-ubuntu-console fuse3 fwupd fwupd-signed gawk gdisk
gettext-base gir1.2-girepository-2.0 gir1.2-glib-2.0 gir1.2-packagekitglib-1.0 git git-man gnupg gnupg-l10n gnupg-utils gpg gpg-agent gpg-wks-client gpgconf gpgsm groff-base htop initramfs-tools
initramfs-tools-bin initramfs-tools-core iproute2 iso-codes jq kbd keyboard-configuration keyboxd klibc-utils kmod kpartx krb5-locales landscape-common less libaio1t64 libapparmor1 libappstream5
libarchive13t64 libargon2-1 libatasmart4 libatm1t64 libblockdev-crypto3 libblockdev-fs3 libblockdev-loop3 libblockdev-mdraid3 libblockdev-nvme3 libblockdev-part3 libblockdev-swap3 libblockdev-utils3
libblockdev3 libbpf1 libbrotli1 libbsd0 libbytesize-common libbytesize1 libcap2-bin libcbor0.10 libcryptsetup12 libcurl3t64-gnutls libcurl4t64 libdbus-1-3 libdevmapper-event1.02.1 libdevmapper1.02.1
libdrm-common libdrm2 libduktape207 libdw1t64 libedit2 libelf1t64 liberror-perl libevdev2 libevent-core-2.1-7t64 libexpat1 libfdisk1 libfido2-1 libflashrom1 libfribidi0 libftdi1-2 libfuse3-3 libfwupd2
libgdbm-compat4t64 libgdbm6t64 libgirepository-1.0-1 libglib2.0-0t64 libglib2.0-bin libglib2.0-data libgpgme11t64 libgpm2 libgssapi-krb5-2 libgstreamer1.0-0 libgudev-1.0-0 libgusb2 libicu74 libinih1
libintl-perl libintl-xs-perl libisns0t64 libjcat1 libjq1 libjson-c5 libjson-glib-1.0-0 libjson-glib-1.0-common libk5crypto3 libkeyutils1 libklibc libkmod2 libkrb5-3 libkrb5support0 libksba8
libldap-common libldap2 liblocale-gettext-perl liblvm2cmd2.03 liblzo2-2 libmagic-mgc libmagic1t64 libmbim-glib4 libmbim-proxy libmbim-utils libmm-glib0 libmnl0 libmodule-find-perl
libmodule-scandeps-perl libmpfr6 libmspack0t64 libnewt0.52 libnghttp2-14 libnl-3-200 libnl-genl-3-200 libnspr4 libnss-systemd libnss3 libntfs-3g89t64 libnvme1t64 libonig5 libopeniscsiusr
libpackagekit-glib2-18 libpam-cap libpam-systemd libparted2t64 libpci3 libperl5.38t64 libplymouth5 libpng16-16t64 libpolkit-agent-1-0 libpolkit-gobject-1-0 libpopt0 libproc-processtable-perl
libprotobuf-c1 libpsl5t64 libpython3-stdlib libpython3.12-minimal libpython3.12-stdlib libpython3.12t64 libqmi-glib5 libqmi-proxy libqmi-utils libqrtr-glib0 libreadline8t64 libreiserfscore0t64
librtmp1 libsasl2-2 libsasl2-modules libsasl2-modules-db libsgutils2-1.46-2 libsigsegv2 libslang2 libsodium23 libsort-naturally-perl libsqlite3-0 libssh-4 libstemmer0d libsystemd-shared libtcl8.6
libterm-readkey-perl libtirpc-common libtirpc3t64 libuchardet0 libudisks2-0 libunwind8 liburcu8t64 libusb-1.0-0 libutempter0 libvolume-key1 libx11-6 libx11-data libxau6 libxcb1 libxdmcp6 libxext6
libxkbcommon0 libxml2 libxmlb2 libxmlsec1t64 libxmlsec1t64-openssl libxmuu1 libxslt1.1 libxtables12 libyaml-0-2 linux-base lsb-release lshw lvm2 lxd-agent-loader lxd-installer mdadm media-types
modemmanager motd-news-config multipath-tools needrestart netbase networkd-dispatcher ntfs-3g open-iscsi open-vm-tools openssh-client openssl overlayroot packagekit packagekit-tools parted pastebinit
patch pci.ids pciutils perl perl-modules-5.38 pinentry-curses plymouth plymouth-theme-ubuntu-text polkitd pollinate publicsuffix python-apt-common python3 python3-apport python3-apt python3-attr
python3-automat python3-bcrypt python3-blinker python3-boto3 python3-botocore python3-certifi python3-cffi-backend python3-chardet python3-click python3-colorama python3-configobj python3-constantly
python3-cryptography python3-dateutil python3-dbus python3-debconf python3-debian python3-distro python3-distro-info python3-distupgrade python3-gdbm python3-gi python3-hamcrest python3-httplib2
python3-hyperlink python3-idna python3-incremental python3-jmespath python3-jwt python3-launchpadlib python3-lazr.restfulclient python3-lazr.uri python3-magic python3-minimal python3-netifaces
python3-newt python3-oauthlib python3-openssl python3-packaging python3-pexpect python3-pkg-resources python3-problem-report python3-ptyprocess python3-pyasn1 python3-pyasn1-modules python3-pyparsing
python3-requests python3-s3transfer python3-service-identity python3-setuptools python3-six python3-software-properties python3-systemd python3-twisted python3-update-manager python3-urllib3
python3-wadllib python3-yaml python3-zope.interface python3.12 python3.12-minimal readline-common run-one sbsigntool screen secureboot-db sg3-utils sg3-utils-udev sgml-base shared-mime-info snapd
software-properties-common sosreport squashfs-tools systemd systemd-dev systemd-hwe-hwdb systemd-resolved systemd-sysv systemd-timesyncd tcl tcl8.6 thin-provisioning-tools tmux tzdata
ubuntu-pro-client ubuntu-pro-client-l10n ubuntu-release-upgrader-core ubuntu-server ucf udev udisks2 unattended-upgrades update-manager-core update-notifier-common usb-modeswitch usb-modeswitch-data
usb.ids vim vim-common vim-runtime xauth xdg-user-dirs xfsprogs xkb-data xml-core xxd xz-utils zerofree zstd