我正在嘗試在 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-r1
或rsync-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}" ]