当前位置: 首页 > news >正文

构建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 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

参考

  1. Docker hub Ubuntu: https://hub.docker.com/_/ubuntu
  2. Mininal Ubuntu Wiki page: https://wiki.ubuntu.com/Minimal
  3. Przemub’s Github repo: https://github.com/przemub/ubuntu-unminimized

备注

备注1: 与参考3的关系

参考3是非常好的范例。我在手动构建和上传docker镜像之后,看到作者的这个repo,非常惊喜,因为作者有类似的功能,而且使用Github Actions workflow非常好的实现了CI。既然有现成的平台和示例代码,为什么不创建一个自己的仓库和CI呢?
我借鉴了作者的代码,并作出以下修改:

  1. build.sh脚本中,简化了字符串处理方式。
  2. Dockerfile中,不安装 ubuntu-server,而是仅安装我需要的软件包。
  3. 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


http://www.mrgr.cn/news/89944.html

相关文章:

  • MHTML文件如何在前端页面展示
  • 在阿里云ECS上一键部署DeepSeek-R1
  • 基于java版本的SaaS云HIS系统源码
  • C语言-预处理
  • Python新春烟花
  • windows 极速安装 Linux (Ubuntu)-- 无需虚拟机
  • 【前端】打造自己的hexo博客_hexo一本通
  • 使用 SDKMAN! 在 Mac(包括 ARM 架构的 M1/M2 芯片)上安装 Java 8
  • Vite 打包原理
  • 【11天从零基础入门flask】第 6 章:模板优化
  • 激活函数篇 03 —— ReLU、LeakyReLU、ELU
  • 程序员也可以这样赚钱
  • Vite 为什么快,是怎么打包的
  • sqli-lab靶场学习(五)——Less15-17(post方法盲注、修改密码)
  • 深度剖析 Redisson 分布式锁:原理、实现与应用实践
  • mysql 学习11 事务,事务简介,事务操作,事务四大特性,并发事务问题,事务隔离级别
  • 深入探究 C++17 std::is_invocable
  • 计算机毕业设计Tensorflow+LSTM空气质量监测及预测系统 天气预测系统 Spark Hadoop 深度学习 机器学习 人工智能
  • 虚拟局域网之详解(Detailed Explanation of Virtual Local Area Network)
  • 参数映射服务完整解决方案
  • A股level2高频数据分析20250205
  • STC51案例操作
  • “公路养护新利器!公路 AI 智慧巡检系统
  • cursor指令工具
  • JavaScript系列(66)--类型系统实现详解
  • 题海拾贝:【高精度】减法