什么时候以及为什么应该使用apt-get update?


15

一般问题:

有人可以解释该命令的apt-get update作用以及何时真正使用它吗?


备注

请给出详细的答案。不仅是手册页的副本,除非您的版本非常详细(我在下面的手册页中放了一个定义)。

apt-get update:用于从其源重新同步程序包索引文件。可用软件包的索引是从/etc/apt/sources.list(5)中指定的位置获取的。应始终在升级或dist-upgrade之前执行更新。


子问题:

  • 包索引存储在哪里?在数据库上?在文件上?
  • 如果apt-get install不更新缓存怎么办?是否有可能不再存在远程软件包并且链接将被断开?
  • 关于deb存储库是否存在一些达成共识的政治?例如,存储库应仅包含软件包的最新版本,还是相反应包含特定发行版可用的所有版本?

语境

我问我的问题是因为我正在研究Docker框架。它的功能之一是Dockerfile,它允许您通过从该文件执行一些指令来构建某种OS映像。该映像的一个属性是,无论上下文如何(构建时间等),它都应该始终相同。

恐怕如果我apt-get update在不同的时间启动命令,结果将有所不同,因此我的图像也会有所不同。


我认为这篇文章可以作为有关如何提出高级问题的Wiki文章。很有用。
Zerodf '18年

Answers:


12

apt-get update 下载可用软件包列表。

软件包列表可能会随时间变化。添加新软件包,并删除旧软件包。因此,如果您的缓存确实很旧,并且尝试执行apt-get install,它可能会尝试下载不再存在的软件包。
旧软件包在存储库中保留的时间取决于回购维护者(您的分发)。因此,如果您使用的是docker之类的工具,其中的缓存可能已过时,则应始终apt-get update在安装任何软件包之前运行。

删除和添加软件包的原因主要是错误修复和安全更新。虽然,如果您使用的是PPA之类的第三方回购协议,一切都会进行。

在公司环境中使用诸如docker之类的容器进行容器化时,您应该构建一次容器,然后在各种发行环境(开发,登台,生产)中移动该容器,而不是每次都不重新构建容器。这将确保您不会得到未经测试的其他容器。

要回答有关缓存文件存放位置的问题,/var/lib/apt/lists


好答案!谢谢!我想对“(...)每次都不要重建容器。这将确保您不会得到未经测试的其他容器”这一段作出回应。我读过,最佳实践是永远不要使用apt-get升级。原因之一是:“它还会产生不一致的映像,因为您不再具有关于应用程序应如何运行以及映像中包括哪些版本的依赖项的真相。” 那不是同样的问题apt-get update吗?Dockerfile不应该保证映像吗?
Pierre-Jean

2
金田 apt-get update只会影响新安装的软件包。仅在新软件包需要时才升级现有软件包(这应该是最小的)。随着apt-get upgrade升级所有软件包,其中包括现有的,导致完全不同的形象。虽然每次您从dockerfile构建时这可能会导致不同的结果,但是我个人认为如果您经历了多环境版本,这并不是一个严重的问题。我认为如果您将dockerfile分发给其他人并让他们进行构建,这将是一个更大的问题。
帕特里克

0

能否解释一下apt-get update命令的作用以及何时真正使用它?

apt-get update 从发行版的软件包存储库下载更新的索引,列出所有可用的软件包及其精确版本。

像Ubuntu和Debian这样的常见发行版通常在其软件包中都是保守的并且向后兼容的,因此这些版本不会随着时间的变化而改变。由于安全更新或错误修复,它们将更改。例如,可以将mysql从升级5.7.185.7.19而不是6.x

包索引存储在哪里?在数据库上?在文件上?

它通常存储在内部的一个或多个文件中/var/lib/apt。在Docker的上下文中,这些文件位于映像内部。构建Dockerfile时,它们会存储在新创建的文件系统层中,并作为新生成的映像持久化。

如果我在不更新缓存的情况下进行apt-get安装会怎样?

您可以尝试下载不再存在的软件包版本。这在虚拟机上很常见,但如果在基础映像构建后发行版本存储库发布了新软件包,则在容器内部也有可能。发行维护者和Dockerfile维护者之间可能没有协调,它们位于发行的下游,并且数量可能更多。只有一个Debian存储库,但有数千个jessie基于容器的映像和Dockerfile。

此外,一些上游图像(如ubuntu图像)会删除下载的索引,以使图像更小并避免文件过时。因此,预期在基础映像之上构建时应下载更新的索引,而不是为每个版本的基础映像都附带最新索引。

是否有可能不再存在远程软件包并且链接将被断开?

当然,因为存储在索引中的版本非常精确,例如5.7.19(简化;它们更类似于5.7.19-0ubuntu1)。

关于deb存储库是否存在一些达成共识的政治?例如,存储库应仅包含软件包的最新版本,还是相反应包含特定发行版可用的所有版本?

一旦有可用的更新,通常会迅速删除旧的次要版本。我认为这是为了节省服务器上的空间,因为二进制文件可能重达数十兆字节,乘以所支持的所有版本和体系结构。因此,通常无法mysql-5.7.18在随后的步骤中固定apt-get install;在mysql-5.7.19发行版中发布后,上一个将被删除。

公平地说,对Docker的这种不确定性apt-get update是作为每个发行版的软件包管理的一部分而引起的。尝试重复构建EC2或Vagrant虚拟机会遇到相同的问题。

一些系统管理员使用诸如Aptly之类的服务来镜像原始存储库并能够固定特定版本,但是除非您有一个经常运行的独立过程来测试更新和更改您的内容,否则您冒着错过安全更新的风险。固定。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.