一般问题:
有人可以解释一下该命令的作用apt-get update
以及我何时真正应该使用它吗?
评论
请给一个详细解答。不仅仅是手册页的副本,除非您的版本非常详细(我在下面的手册页中添加了一个定义)。
apt-get 更新:用于从源重新同步包索引文件。可用包的索引是从 /etc/apt/sources.list(5) 中指定的位置获取的。应始终在升级或 dist-upgrade 之前执行更新。
子问题:
- 包索引存储在哪里?在数据库上?在文件上?
- 如果我
apt-get install
不更新缓存会发生什么?远程包是否有可能不再存在并且链接将被破坏? - 关于 deb 存储库是否有一些商定的政策?例如,存储库是否应该仅包含软件包的最后一个版本,或者相反,它是否应该包含可用于特定发行版的所有版本?
语境
我问这个问题是因为我正在研究Docker框架。其特点之一是Dockerfile,它允许您通过执行该文件中的某些指令来构建某种操作系统映像。该图像的一个属性是,无论上下文是什么(构建时间等),它都应该始终相同。
我担心如果我apt-get update
在不同的时间启动命令,结果会有所不同,所以我的图像也会有所不同。
答案1
apt-get update
下载可用软件包的列表。
包列表可能会随着时间的推移而改变。添加新包,删除旧包。因此,如果您有一个非常旧的缓存,并且您尝试执行apt-get install
,它可能会尝试下载不再存在的包。
旧包在存储库中保留多长时间取决于存储库维护者(您的发行版)。因此,如果您使用的是 docker 之类的东西,其中缓存可能非常过时,您应该始终apt-get update
在安装任何软件包之前运行。
删除和添加软件包的原因主要是错误修复和安全更新。不过,如果您使用 PPA 之类的第 3 方存储库,那么一切都会发生。
在企业环境中使用 docker 等容器化工具时,您应该构建一次容器,然后将该容器移动到各种发布环境(开发、暂存、生产)中,而不是每次都重新构建容器。这将确保您不会获得未经测试的不同容器。
要回答您的缓存文件所在位置的问题,/var/lib/apt/lists
.
答案2
有人可以解释一下命令 apt-get update 的作用以及我何时真正应该使用它吗?
apt-get update
从发行版的软件包存储库下载更新的索引,列出所有可用的软件包及其精确版本。
像 Ubuntu 和 Debian 这样的常见发行版在其软件包产品中通常是保守的和向后兼容的,因此版本不会随着时间的推移而发生太大变化;它们会因安全更新或错误修复而发生变化。例如,mysql 可以从 升级5.7.18
到5.7.19
但不能升级到6.x
。
包索引存储在哪里?在数据库上?在文件上?
它通常存储在一个或多个文件内/var/lib/apt
。在 Docker 上下文中,这些文件位于映像内部。构建 Dockerfile 时,它们会存储在新的文件系统层中,这些文件系统会作为新构建的映像创建并保留。
如果我在不更新缓存的情况下执行 apt-get install 会发生什么?
您可以尝试下载不再存在的软件包版本。这在虚拟机上很常见,但如果分发存储库在构建基础映像后发布了新包,那么在容器内也可能发生这种情况。发行版维护者和 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 虚拟机时,您会遇到同样的问题。
一些系统管理员使用诸如恰当地镜像原始存储库并能够固定特定版本,但是您将面临错过安全更新的风险,除非您有一个经常运行的单独流程来测试更新并更改您固定的内容。