在不升级的情况下恢复包状态以保持较小的Docker容器

时间:2016-02-26 15:02:39

标签: linux ubuntu docker apt-get dpkg

作为Dockerfile的一步,我需要安装build-essential软件包(如果不可用)并运行make。保持容器的占地面积小而小;我还想在完成后删除build-essential和所有产生的依赖项。

只需使用apt-get remove删除它然后自动移除它就行不通;安装的大多数软件包(100mb左右)都被遗忘,可能是因为它们被其他人列为推荐或建议的软件包。也;除非明确检查该情况,否则这种方法可能会从已经包含它的基础图像中删除build-essential(并且仍然应该),这可能会有风险。

另一种方法是检查安装包列表,并在make之后恢复到该状态。我的几乎工作解决方案是一个包含以下内容的脚本:

dpkg --get-selections > /before
apt-get -y install build-essential
make -C <path to Makefile>
dpkg --clear-selections
dpkg --set-selections < /before 
apt-get -y dselect-upgrade

这样可以成功恢复软件包状态并删除已安装的软件包,同时保留所有现有的软件包。大。然而;具有待定更新的系统上的现有软件包也会更新 - 我现在非常希望避免这种情况,因为这会给这个特定的docker层增加不必要的重量。

The following packages will be upgraded:
  apt apt-utils base-files coreutils cpio dpkg gcc-4.9-base ifupdown
  initscripts isc-dhcp-client isc-dhcp-common libapt-inst1.5 libapt-pkg4.12
  libc-bin libdrm2 libffi6 libgcc1 libgcrypt11 libgnutls-openssl27 libgnutls26
  libpng12-0 libssl1.0.0 libudev1 login multiarch-support ntpdate passwd
  sysv-rc sysvinit-utils udev
30 upgraded, 0 newly installed, 38 to remove and 0 not upgraded.
Need to get 11.3 MB of archives.
...

问题是;如何恢复包状态(读取:删除build-essential安装的所有新包),而不会导致更新任何包?

1 个答案:

答案 0 :(得分:1)

管理自己解决:

dpkg --get-selections > /before
apt-get -y install build-essential
make -C <path to Makefile>
dpkg --clear-selections
cat /before | sed 's/install/hold/' | dpkg --set-selections
apt-get -y dselect-upgrade
dpkg --set-selections < /before

关键区别在于将所有不被删除的套餐设置为“保持”状态。 (然后将其恢复为对未来升级的礼貌)。