Por que o Alpine apk relata “restrições insatisfatórias” ao instalar uma versão mais antiga do Node.js?

Por que o Alpine apk relata “restrições insatisfatórias” ao instalar uma versão mais antiga do Node.js?

Estou tentando instalar uma versão mais antiga do Node.js (4.4.4) no Alpine. Aqui estão meus comandos:

apk update
apk add nodejs-lts=4.4.4-r0

Quando executo, recebo um erro (executando como root porque estou usando a imagem 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]

Como instalo uma versão específica e mais antiga de um pacote no apk?

Responder1

Está correto. Infelizmente, 4.4.4 não está disponível.

Você deve evitar ser explícito nas versões dos pacotes, a menos que controle seu próprio espelho e construção de pacotes, em vez disso, permita que o sistema de pacotes manipule isso para a versão Alpine em uso.

Para Alpine 3.4, apenas 4.6.0 está disponível.Pesquise pacotes Alpine 3.4 x86_64 on-line para nodejs-lts

Se você quiser, aqui está a fonte do pacote a ser alterado para construir uma versão específica de sua escolha.

Revise a origem do pacote

Alpine tem uma página wiki:Criando um pacote Alpine.

Observe que o nome do pacote 'nodejs-lts' está obsoleto.

fornece="nodejs-lts=$pkgver" # para compatibilidade com versões anteriores

substitui = "nodejs-current nodejs-lts" # nodejs-lts para compatibilidade com versões anteriores

Responder2

Infelizmente,Gerenciamento de pacotes Alpine-Linuxdescarta pacotes mais antigos quando há versões mais recentes disponíveis. Isso dificulta o uso do Alpine Linux com docker, pois você deseja uma imagem reproduzível com versões exatas.

Veja issoartigopara todo o resumo. As duas soluções oferecidas: Crie seu próprio espelho e hospede a versão específica dos pacotes aos quais deseja continuar tendo acesso (provavelmente não vale o esforço) ou use uma imagem base diferente, como Ubuntu, cujo sistema de gerenciamento de pacotes não cai versões mais antigas de pacotes (como intuitivamente esperado de qualquer sistema moderno de gerenciamento de pacotes).

E suponho que você poderia simplesmente atualizar seu arquivo docker para usar a versão mais recente disponível desses pacotes. No entanto, será apenas uma questão de tempo até que você se depare com a mesma situação novamente. Simplesmente não é escalável se você estiver construindo para um sistema de produção.

Responder3

Você pode usar uma versão específica da versão Alpine anterior usando o seguinte, cujo exemplo alia-lib-devestá definido como 1.1.7-r0 no Alpine Edge, mas aqui forçado a ser 1.1.6-r0 do Alpine 3.8:

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

Responder4

Encontrei uma solução alternativa que considero um meio termo.

Ainda posso definir o versionamento semântico, só não defino o número da versão.

ou seja, eu quero rsync-3.2.3, mas não me importo se é rsync-3.2.3-r1ou rsync-3.2.3-r4.

Eu ficaria muito preocupado se houvesse alguma alteração significativa entre eles e gostaria que meu contêiner docker fosse construído independentemente de existir um novo ID de lançamento e eu não soubesse.

No contêiner do docker abaixo, defino a versão semântica como ARGe, em seguida, executo uma pesquisa de uma ferramenta apk searche, em seguida, a greppara encontrar a versão semântica com o ID de lançamento. Eu uso esse valor para instalar o pacote.

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

informação relacionada