能否解释一下apt-get update命令的作用以及何时真正使用它?
apt-get update
从发行版的软件包存储库下载更新的索引,列出所有可用的软件包及其精确版本。
像Ubuntu和Debian这样的常见发行版通常在其软件包中都是保守的并且向后兼容的,因此这些版本不会随着时间的变化而改变。由于安全更新或错误修复,它们将更改。例如,可以将mysql从升级5.7.18
到5.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之类的服务来镜像原始存储库并能够固定特定版本,但是除非您有一个经常运行的独立过程来测试更新和更改您的内容,否则您冒着错过安全更新的风险。固定。