为什么 Alpine apk 在安装旧版本的 Node.js 时会报告“无法满足的约束”?

Mat*_*ams 7 node.js alpine-linux

我正在尝试在 Alpine 上安装旧版本的 Node.js (4.4.4)。这是我的命令:

apk update
apk add nodejs-lts=4.4.4-r0
Run Code Online (Sandbox Code Playgroud)

执行时,出现错误(以 root 身份运行,因为我使用的是 Alpine:3.4 Docker 映像):

/ # apk update
fetch http://dl-cdn.alpinelinux.org/alpine/v3.4/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.4/community/x86_64/APKINDEX.tar.gz
v3.4.6-64-gd029d25 [http://dl-cdn.alpinelinux.org/alpine/v3.4/main]
v3.4.6-33-g38ef2d2 [http://dl-cdn.alpinelinux.org/alpine/v3.4/community]
OK: 5977 distinct packages available
/ # apk add nodejs-lts=4.4.4-r0
ERROR: unsatisfiable constraints:
  nodejs-lts-4.6.0-r0:
    breaks: world[nodejs-lts=4.4.4-r0]
Run Code Online (Sandbox Code Playgroud)

如何在 中安装特定的旧版本软件包apk

小智 10

那是正确的。不幸的是,4.4.4 不可用。

除非控制您自己的包镜像和包构建,否则您应该避免明确包版本,而是允许包系统为正在使用的 Alpine 版本处理它。

对于 Alpine 3.4,只有 4.6.0 可用。在线搜索 Alpine 3.4 x86_64 软件包以获取 nodejs-lts

如果您如此倾向,这里是为了构建特定版本的选择而更改包的源代码。

查看包源

Alpine 有一个 wiki 页面:Creating an Alpine package

请注意,不推荐使用“nodejs-lts”包名称。

provide="nodejs-lts=$pkgver" # 向后兼容

替换 =“nodejs-current nodejs-lts” # nodejs-lts 向后兼容

  • 所以不可能固定版本?使容器图像不可变/ (6认同)

Gov*_*Rai 8

不幸的是,当有新版本可用时,Alpine-Linux 包管理会丢弃旧包。这使得在 docker 中使用 Alpine Linux 变得很困难,因为您需要一个具有精确版本的可重现图像。

有关整个纲要,请参阅本文。提供的两种解决方案:创建您自己的镜像并托管您希望继续访问的特定版本的软件包(可能不值得付出努力)或使用不同的基础映像,例如软件包管理系统不会丢失的 Ubuntu旧版本的包(正如任何现代包管理系统的直观预期)。

而且,我想您可以更新您的 docker 文件以使用这些软件包的最新可用版本。但是,再次遇到同样的情况只是时间问题。如果您正在为生产系统构建,它就是不可扩展的。