¿Por qué Alpine apk informa "restricciones insatisfactorias" al instalar una versión anterior de Node.js?

¿Por qué Alpine apk informa "restricciones insatisfactorias" al instalar una versión anterior de Node.js?

Estoy intentando instalar una versión anterior de Node.js (4.4.4) en Alpine. Aquí están mis comandos:

apk update
apk add nodejs-lts=4.4.4-r0

Cuando ejecuto, aparece un error (ejecutando como root porque estoy usando la imagen de Docker Alpine:3.4):

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

¿Cómo instalo una versión anterior específica de un paquete en apk?

Respuesta1

Eso es correcto. Lamentablemente, la versión 4.4.4 no está disponible.

Debe evitar ser explícito sobre las versiones de los paquetes a menos que controle su propio espejo de paquete y sus compilaciones; en lugar de eso, permita que el sistema de paquetes lo maneje para la versión de Alpine en uso.

Para Alpine 3.4, solo está disponible la versión 4.6.0.Busque paquetes Alpine 3.4 x86_64 en línea para nodejs-lts

Si así lo desea, aquí está la fuente para que el paquete cambie para crear una versión específica de su elección.

Revisar la fuente del paquete

Alpine tiene una página wiki:Creando un paquete alpino.

Tenga en cuenta que el nombre del paquete 'nodejs-lts' está en desuso.

proporciona="nodejs-lts=$pkgver" # para compatibilidad con versiones anteriores

reemplaza="nodejs-current nodejs-lts" # nodejs-lts para compatibilidad con versiones anteriores

Respuesta2

Desafortunadamente,Gestión de paquetes Alpine-Linuxelimina paquetes más antiguos cuando hay versiones más nuevas disponibles. Esto dificulta el uso de Alpine Linux con Docker, ya que desea una imagen reproducible con versiones exactas.

Mira estoartículopara todo el resumen. Las dos soluciones que se ofrecen: crear su propio espejo y alojar la versión específica de los paquetes a los que desea seguir teniendo acceso (probablemente no valga la pena el esfuerzo) o utilizar una imagen base diferente, como Ubuntu, cuyo sistema de administración de paquetes no falla. versiones anteriores de paquetes (como se espera intuitivamente de cualquier sistema de gestión de paquetes moderno).

Y supongo que podría actualizar su archivo acoplable para usar la última versión disponible de esos paquetes. Sin embargo, sólo será cuestión de tiempo que vuelvas a encontrarte con la misma situación. Simplemente no es escalable si está construyendo para un sistema de producción.

Respuesta3

Puede usar una versión específica de la versión anterior de Alpine usando lo siguiente, cuyo ejemplo alia-lib-devestá configurado en 1.1.7-r0 en Alpine Edge, pero aquí está obligado a ser 1.1.6-r0 de 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

Respuesta4

Encontré una solución que creo que es un término medio.

Todavía puedo configurar el control de versiones semántico, pero no configuro el número de versión.

es decir, quiero rsync-3.2.3, pero no me importa si es rsync-3.2.3-r1o rsync-3.2.3-r4.

Me preocuparía mucho si hubiera algún cambio importante entre estos y querría que mi contenedor acoplable se compilara independientemente de si existiera una nueva identificación de versión y no me diera cuenta.

En el contenedor acoplable a continuación, configuro la versión semántica como ARGy luego ejecuto una búsqueda de una herramienta apk searchy luego a greppara encontrar la versión semántica con la identificación de la versión. Utilizo este valor para luego instalar el paquete.

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

información relacionada