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

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

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

apk update
apk add nodejs-lts=4.4.4-r0

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

/ # 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]

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

答案1

没错。遗憾的是,4.4.4 不可用。

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

对于 Alpine 3.4,仅 4.6.0 可用。在线搜索 Alpine 3.4 x86_64 软件包以查找 nodejs-lts

如果您愿意,这里是可以更改的软件包的源代码,以便构建您选择的特定版本。

查看包源

Alpine 有一个 wiki 页面:创建 Alpine 包

请注意,“nodejs-lts”包名已被弃用。

提供=“nodejs-lts=$pkgver”#用于向后兼容

replaces="nodejs-current nodejs-lts" # nodejs-lts 用于向后兼容

答案2

很遗憾,Alpine-Linux 软件包管理当有新版本可用时,删除旧版本软件包。这使得将 Alpine Linux 与 docker 一起使用变得困难,因为您需要具有精确版本的可重现映像。

看到这个文章了解整个概要。提供两种解决方案:创建您自己的镜像并托管您希望继续访问的软件包的特定版本(可能不值得付出努力)或使用不同的基础映像,例如 Ubuntu,其软件包管理系统不会删除旧版本的软件包(正如任何现代软件包管理系统直观预期的那样)。

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

答案3

您可以使用以下方法使用以前 Alpine 版本中的特定版本,其中示例alia-lib-dev在 Alpine Edge 中设置为 1.1.7-r0,但这里强制为 Alpine 3.8 中的 1.1.6-r0:

apk add --no-cache --update-cache --repository http://nl.alpinelinux.org/alpine/v3.8/main alsa-lib-dev=1.1.6-r0

答案4

我找到了一个我认为是折衷的解决方法。

我仍然可以设置语义版本,只是不设置发布号。

即我想要rsync-3.2.3,但我不在乎它是否rsync-3.2.3-r1rsync-3.2.3-r4

如果这两者之间有任何重大变化,我会非常担心,并且希望我的 docker 容器能够构建,无论是否存在新的发布 ID,而我却一无所知。

在下面的 docker 容器中,我将语义版本设置为ARG,然后运行工具搜索apk search,然后运行grep以找到具有发布 ID 的语义版本。然后我使用此值安装包。

FROM docker.io/alpine:3.13.2

LABEL author="Alexis Lucattini" \
      description="Run rsync 3.2.3" \
      maintainer="[email protected]"

ARG TOOL_NAME="rsync"
ARG TOOL_VERSION="3.2.3"
ARG FUZZY="true"
ARG ALPINE_MAIN_REPOSITORY="http://dl-cdn.alpinelinux.org/alpine/v3.13/main"

# User args
ARG USER="alpine_user"
ARG UID=1000
ARG GID=1000
ARG GROUP="alpine_group"

RUN apk update --quiet && \
    if [[ "${FUZZY-}" == "true" ]]; then \
      TOOL_VERSION="$(apk search --no-cache --repository "${ALPINE_MAIN_REPOSITORY}" \
                        "${TOOL_NAME}" | \
                      grep "^${TOOL_NAME}-${TOOL_VERSION}" | \
                      sed "s%^${TOOL_NAME}-%%")"; \
    fi; \
    apk add --no-cache --repository "${ALPINE_MAIN_REPOSITORY}" \
      "${TOOL_NAME}=${TOOL_VERSION}"

RUN addgroup \
    --system \
    --gid "${GID}" \
    "${GROUP}" && \
    adduser \
    --system \
    --disabled-password \
    --ingroup "${GROUP}" \
    --uid "${UID}" \
    "$USER"

USER "$USER"

CMD [ "${TOOL_NAME}" ]

相关内容