이전 버전의 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 이미지를 사용하고 있기 때문에 루트로 실행 중).

/ # 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만 사용할 수 있습니다.nodejs-lts에 대한 Alpine 3.4 x86_64 패키지 온라인 검색

원하는 경우 특정 버전을 선택하기 위해 변경할 패키지의 소스는 다음과 같습니다.

패키지 소스 검토

Alpine에는 위키 페이지가 있습니다.알파인 패키지 만들기.

'nodejs-lts' 패키지 이름은 더 이상 사용되지 않습니다.

presents="nodejs-lts=$pkgver" # 이전 버전과의 호환성을 위해

replacement="nodejs-current nodejs-lts" # 이전 버전과의 호환성을 위한 nodejs-lts

답변2

안타깝게도,Alpine-Linux 패키지 관리사용 가능한 최신 버전이 있으면 이전 패키지를 삭제합니다. 정확한 버전으로 재현 가능한 이미지를 원하기 때문에 docker와 함께 Alpine Linux를 사용하기가 어렵습니다.

이것 좀 봐기사전체 요약을 위해. 제공되는 두 가지 솔루션: 자신만의 미러를 생성하고 계속 액세스하려는 특정 버전의 패키지를 호스팅하거나(노력할 가치가 없을 수도 있음) 패키지 관리 시스템이 삭제되지 않는 Ubuntu와 같은 다른 기본 이미지를 사용합니다. 이전 버전의 패키지(현대 패키지 관리 시스템에서 직관적으로 예상됨)

그리고 해당 패키지의 최신 버전을 사용하도록 도커 파일을 업데이트할 수 있다고 가정합니다. 그러나 이와 같은 상황이 다시 발생하는 것은 시간 문제일 뿐입니다. 프로덕션 시스템을 구축하는 경우에는 확장성이 없습니다.

답변3

다음을 사용하여 이전 알파인 릴리스의 특정 버전을 사용할 수 있습니다. alia-lib-dev그 예는 알파인 에지에서 1.1.7-r0으로 설정되었지만 여기서는 알파인 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가 존재하는지 여부에 관계없이 내 도커 컨테이너가 빌드되기를 원할 것입니다.

아래 도커 컨테이너에서 의미 체계 버전을 an으로 설정한 ARG다음 a를 통해 도구 검색을 실행하여 릴리스 ID가 있는 의미 체계 버전을 찾습니다 apk search. grep이 값을 사용하여 패키지를 설치합니다.

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}" ]

관련 정보