无法解释为什么 Alpine apk upgrade 命令不更新 ncurses 包,尽管存在更新版本

Cannot explain why Alpine apk upgrade command does not update ncurses package although a newer version exists

我有一个 Dockerfile 作为:

FROM nginx:1.21.3-alpine

RUN apk update && apk add bash \
    && apk upgrade

我可以看到软件包 ncurses 已安装,版本为 6.2_p20210612-r0。 现在,main 存储库 edge 分支中有一个更新的软件包,版本为 6.2_p20211002-r0 here.

据我所知,在从上述 Dockerfile 构建镜像后,ncurses 的版本应该更新为 6.2_p20211002-r0,但它仍保持为 6.2_p20210612-r0。我不明白为什么?

我在构建后通过 运行 一个容器确认了这一点 运行:

apk info -a ncurses

输出为:

ncurses-6.2_p20210612-r0 installed size:
284 KiB

nginx:1.21.3-alpine 图像基于 Alpine 3.14(参见 cat /etc/os-release),因此 ncurses 使用 Alpine 3.14 存储库的版本更新,目前为 6.2_p20210612-r0

要从边缘(当前版本 6.2_p20211002-r0)安装 ncurses,您可以在 apk 命令中明确指定边缘存储库:

apk add ncurses --repository=http://dl-cdn.alpinelinux.org/alpine/edge/main

在某些情况下,以这种方式混合和匹配来自不同存储库的包可能没问题,但必须仔细测试。对于 ncurses,一些功能可能会被破坏,因为匹配的 ncurses-libs 包也应该被安装,但是一些包图像依赖于 ncurses-libs,所以重新安装它会触发更新这些包。此外,nginx-module-njs 依赖包必须被删除。如果这是可以接受的,您可以按如下方式修改 Dockerfile:

FROM nginx:1.21.3-alpine

RUN apk update && \
    apk del ncurses ncurses-libs nginx-module-njs && \
    apk add ncurses ncurses-libs --repository=http://dl-cdn.alpinelinux.org/alpine/edge/main && \
    apk add bash && \
    apk upgrade