Warum meldet Alpine apk „unerfüllbare Einschränkungen“, wenn eine ältere Version von Node.js installiert wird?

Warum meldet Alpine apk „unerfüllbare Einschränkungen“, wenn eine ältere Version von Node.js installiert wird?

Ich versuche, eine ältere Version von Node.js (4.4.4) auf Alpine zu installieren. Hier sind meine Befehle:

apk update
apk add nodejs-lts=4.4.4-r0

Beim Ausführen wird mir ein Fehler angezeigt (ich führe es als Root aus, da ich das Docker-Image Alpine:3.4 verwende):

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

Wie installiere ich eine bestimmte, ältere Version eines Pakets in apk?

Antwort1

Das ist richtig. Leider ist 4.4.4 nicht verfügbar.

Sie sollten keine expliziten Angaben zu Paketversionen machen, es sei denn, Sie steuern Ihren eigenen Paketspiegel und Ihre eigenen Paketerstellungen. Überlassen Sie dies lieber dem Paketsystem für die verwendete Alpine-Version.

Für Alpine 3.4 ist nur 4.6.0 verfügbar.Durchsuchen Sie Alpine 3.4 x86_64-Pakete online nach nodejs-lts

Wenn Sie möchten, können Sie hier die Quelle des Pakets ändern, um eine bestimmte Version Ihrer Wahl zu erstellen.

Überprüfen der Paketquelle

Alpine hat eine Wiki-Seite:Erstellen eines Alpenpakets.

Beachten Sie, dass der Paketname „nodejs-lts“ veraltet ist.

provides="nodejs-lts=$pkgver" # für Abwärtskompatibilität

ersetzt="nodejs-current nodejs-lts" # nodejs-lts für Abwärtskompatibilität

Antwort2

Bedauerlicherweise,Alpine-Linux Paketverwaltunglöscht ältere Pakete, wenn neuere Versionen verfügbar sind. Dies erschwert die Verwendung von Alpine Linux mit Docker, da Sie ein reproduzierbares Image mit exakten Versionen wünschen.

Sieh dir das anArtikelfür die gesamte Übersicht. Die beiden angebotenen Lösungen: Erstellen Sie Ihren eigenen Spiegel und hosten Sie die spezifische Version der Pakete, auf die Sie weiterhin Zugriff haben möchten (wahrscheinlich lohnt sich der Aufwand nicht) oder verwenden Sie ein anderes Basisimage wie Ubuntu, dessen Paketverwaltungssystem ältere Paketversionen nicht löscht (wie von jedem modernen Paketverwaltungssystem intuitiv erwartet).

Und ich nehme an, Sie könnten einfach Ihre Docker-Datei aktualisieren, um die neueste verfügbare Version dieser Pakete zu verwenden. Es ist jedoch nur eine Frage der Zeit, bis Sie erneut in dieselbe Situation geraten. Es ist einfach nicht skalierbar, wenn Sie für ein Produktionssystem bauen.

Antwort3

Sie können eine bestimmte Version einer früheren Alpine-Version wie folgt verwenden. alia-lib-devIn Alpine Edge ist sie beispielsweise auf 1.1.7-r0 eingestellt, hier wird jedoch die Version 1.1.6-r0 von Alpine 3.8 erzwungen:

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

Antwort4

Ich habe einen Workaround gefunden, der meiner Meinung nach einen guten Mittelweg darstellt.

Die semantische Versionierung kann ich weiterhin festlegen, ich lege lediglich nicht die Release-Nummer fest.

d. h. ich möchte rsync-3.2.3, aber es ist mir egal, ob es rsync-3.2.3-r1oder ist rsync-3.2.3-r4.

Ich wäre sehr besorgt, wenn es zwischen diesen irgendwelche gravierenden Änderungen gäbe, und würde wollen, dass mein Docker-Container unabhängig davon erstellt wird, ob eine neue Release-ID existiert und ich nichts davon wüsste.

Im Docker-Container unten lege ich die semantische Version als fest ARGund führe dann eine Suche mit einem Tool durch apk searchund dann durch aus, grepum die semantische Version mit der Release-ID zu finden. Diesen Wert verwende ich dann, um das Paket zu installieren.

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

verwandte Informationen