【问题标题】:Restoring package state without upgrade to keep Docker Container small在不升级的情况下恢复包状态以保持 Docker 容器小
【发布时间】:2016-02-27 02:01:25
【问题描述】:

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

简单地用 apt-get remove 后跟 autoremove 删除它是行不通的;大多数已安装的软件包(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 安装的所有新包)?

【问题讨论】:

    标签: linux ubuntu docker apt-get dpkg


    【解决方案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
    

    主要区别是将所有不被删除的软件包设置为“保留”(然后将其恢复为对未来升级的礼貌)。

    【讨论】:

    • 但是这种方法不会减小图像的大小.... 不完全清楚您要达到的目标。是否考虑过两步构建过程?使用一个容器(带有构建要素)来构建您的二进制文件,并使用另一个镜像来打包构建二进制文件。
    • 它实际上确实减少了相当多的大小(减少了 130MB 左右),因为所有步骤都在脚本中运行并且没有创建中间层。但是,在单独的 Docker 命令中运行上述每个命令都行不通。运行一个单独的构建容器不是一个坏主意,但它需要一个在层次结构中的 dockerfile(s) 之上运行的附加脚本;即我将无法立即运行 docker build 。尽管如此,这些解决方案还是有一些优点,特别是如果您只使用某种图像(不幸的是,我正在研究的基本上是黑盒)。感谢您的评论!
    • 明白。不清楚您是否将所有命令作为 Dockerfile 中的一个步骤运行,这肯定会减少创建的映像层。玩得开心:-)
    猜你喜欢
    • 2019-07-27
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多