為什麼 Alpine apk 在安裝舊版的 Node.js 時會報告「無法滿足的約束」?

為什麼 Alpine apk 在安裝舊版的 Node.js 時會報告「無法滿足的約束」?

我正在嘗試在 Alpine 上安裝舊版本的 Node.js (4.4.4)。這是我的命令:

apk update
apk add nodejs-lts=4.4.4-r0

當我執行時,出現錯誤(以 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]

如何安裝特定的舊版本的軟體包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”#用於向後相容

替換=“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

我會非常擔心這些之間是否有任何重大變化,並且希望無論是否存在新的版本 ID 都可以建置我的 docker 容器,但我對此一無所知。

在下面的 docker 容器中,我將語義版本設為 an ARG,然後運行工具搜索,apk search然後透過 agrep查找具有發布 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}" ]

相關內容