我目前使用 alpine:3.13 作为基础镜像。在那里,我使用以下命令安装了 nodejs:。apk add nodejs=~14.15
但是,3.13 分支包含一个新的 nodejs(14.16),而 14.15 不再存在。因此,我的镜像构建失败。
这真的很烦人,而且不符合 Docker 的目的。有什么可能的解决方案可以不必不断更新软件包编号?我想我在某个地方读过,但我不记得在哪里写着“旧 Alpine 镜像中的软件包不会被删除。例如,在 alpine:3.12 中,我们有 nodejs=12.21.0-r0,并且这个特定版本不会从 alpine:3.12 中删除”。前面的说法是正确的吗?如果不是,可以做些什么来保持一致性?
答案1
Alpine 确实会删除旧软件包版本,并用新软件包版本取代。虽然这可以确保只有最新和更新的软件包可用,但确实会造成镜像维护方面的麻烦,尤其是当镜像依赖于特定软件包版本时。
如果您没有绑定到特定的软件包版本,则不要使用版本固定。也就是说,仅通过软件包名称安装软件包:
apk add nodejs
然后,当使用 升级包时apk upgrade
,它将更新为 Alpine 存储库中可用的最新版本。
旧版 Alpine 镜像中的软件包不会被删除。例如,在 alpine:3.12 中,我们有 nodejs=12.21.0-r0,这个特定版本不会从 alpine:3.12 中删除
事实并非如此。Alpine 会定期推出软件包更新。在许多情况下,您仍然可以在旧版 Alpine 的存储库中找到旧版软件包。但是,例如,如果某个软件包有一个关键的安全修复程序,则它很可能会应用于所有尚未终止的 Alpine 存储库。然后,就没有办法获得它了,因为所有 Alpine 镜像存储库几乎同时更新(在这种情况下,要获取特定的软件包版本,您必须从已包含它的预构建映像中获取它)。