2016-03-20 08:45:08 +0000 2016-03-20 08:45:08 +0000
102
102

Wie installiert man eine bestimmte Paketversion in Alpine?

Ich habe ein Dockerfile, um ein Docker-Image zu erstellen, das auf Alpine Linux basiert. Nun muss ich ein Paket als Teil dieses Dockerfile installieren.

Derzeit habe ich:

RUN apk update && \
    apk upgrade && \
    apk add git

Offensichtlich ist dies eine schlechte Idee, da das Ergebnis nicht deterministisch ist. Stattdessen hängt es von dem Zeitpunkt ab, an dem ich das Image erstelle, welche Version von git installiert wird.

Was ist der korrekte Weg, dies zu tun?

Ich vermute, dass ich updated, upgrade und add mitteilen muss, welche Versionen verwendet werden sollen, aber wie mache ich das?

Ich habe gesehen, dass apk das Anheften von Repositories unterstützt, aber das ist nicht das, was ich will (zumindest glaube ich das), denn ich möchte nicht ein Repository anheften, sondern ein Paket.

Mit anderen Worten: Wenn git über npm installiert werden könnte, wäre ich in der Lage,

npm install git@1.9.2

(oder welche Version ich auch immer haben möchte). Was ist das Äquivalent dazu für Alpine Linux?

Antwoorden (5)

89
89
89
2016-03-29 14:25:32 +0000

Sie können “klebrige” Versionen wie folgt festlegen:

# Both are equal
apk add packagename=1.2.3-suffix
apk add 'packagename<1.2.3-suffix'

Das wird Pakete nur bis zur angegebenen Version aktualisieren. Sie können dann sicher …

apk upgrade

verwenden, um alle Pakete zu aktualisieren, während Pakete mit Versionen in ihrer Version bleiben. Um eine minimale Version zu setzen, verwenden Sie einfach …

apk add "packagename>1.2.3-suffix"

Falls Sie ein Paket nicht finden können, obwohl Sie es in der UI für Alpine-Pakete sehen können, aktualisieren Sie Ihre Quellen/Paketdatenbank:

apk update

Das Paket-Repository finden Sie hier :

https://pkgs.alpinelinux.org/packages

Pinnen Sie niemals Pakete aus dem “edge”-Zweig des alpinen Paket-Repos, da diese sich in der Testphase befinden und widerrufen werden können. (Klicken Sie unter pkgs.alpinelinux.org/packages auf “edge” und ändern Sie es in die alpine Image-Version, die Sie verwenden, und klicken Sie erneut auf “search”).

17
17
17
2016-03-25 08:30:23 +0000

Derzeit gibt es keine Möglichkeit, beliebige ältere Versionen eines Pakets aus offiziellen Repositories in Alpine Linux zu installieren. Das Beste, was Sie erreichen können, ist die Verwendung von Repositories der früheren Versionen:

# cat /etc/alpine-release
3.3.3

# echo 'http://dl-cdn.alpinelinux.org/alpine/v3.2/main' >> /etc/apk/repositories

# apk update
fetch http://dl-cdn.alpinelinux.org/alpine/v3.3/community/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.3/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.2/main/x86_64/APKINDEX.tar.gz

# apk add bash==4.3.33-r0
(1/1) Updating pinning bash (4.3.33-r0)
OK: 13 MiB in 17 packages

# apk add bash==4.3.42-r3
(1/2) Upgrading bash (4.3.33-r0 -> 4.3.42-r3)
Executing bash-4.3.42-r3.post-upgrade
(2/2) Purging ncurses5-libs (5.9-r1)
Executing busybox-1.24.1-r7.trigger
OK: 13 MiB in 16 packages
1
1
1
2020-02-14 21:42:45 +0000

Die Syntax für das Anheften von Alpine-Paketen mit apk ist apk add packageName==x.y.z.

Beim Anheften von Alpine-Paketen in Docker-Images müssen Sie jedoch aufpassen, dass Sie die spezifische Version verwenden, die zu Ihrem Image passt, und den edge-Zweig vermeiden.

Sie können die Alpine-Pakete unter https://pkgs.alpinelinux.org/packages einsehen. Leider ist dies standardmäßig der edge-Zweig, der Pakete enthält, die möglicherweise widerrufen werden.

Geben Sie unter https://pkgs.alpinelinux.org/packages den Namen des gewünschten Pakets ein, ändern Sie den Zweig von edge so, dass er mit der von Ihnen verwendeten Alpine-Image-Version übereinstimmt, und setzen Sie die Arch (Architektur), und drücken Sie dann search. (Wenn Sie die Architektur nicht kennen, starten Sie den Container und geben Sie uname -m ein.)

Dies zeigt Ihnen die einzige(n) stabile(n) Version(en) des Pakets, die Sie sicher anpinnen können. Das Anheften des Pakets an eine andere Version kann dazu führen, dass Ihr Dockerfile eines Tages nicht mehr funktioniert, weil das Paket aus dem Alpine-Paket-Repository zurückgezogen wird.

Beispiel:

FROM alpine:3.3
RUN apk update && apk upgrade
RUN apk add --no-cache \
  git==2.8.6-r0 \
  bash==4.3.42-r6 \
  python3==3.5.1-r0
1
1
1
2020-02-26 16:02:56 +0000

Vlad Frolov hat die Antwort bereits gegeben. Ich schreibe gerade die Docker-Lösung. Ich habe versucht, ein Paket aus dem Repository v3.8 hinzuzufügen.

  • Durchsuchen Sie das alte Archiv http://dl-cdn.alpinelinux.org/alpine/ und holen Sie die spezifische Repository-Version Ihrer Software.
  • Nachdem Sie die Repository-Version erhalten haben, fügen Sie die Version zu Ihrer Docker-Datei hinzu
  • Geben Sie die genaue Version Ihres Pakets aus dem Repository an
1
1
1
2018-08-21 17:55:01 +0000

Weil ich das testing Repo verwendet habe. Ich habe schließlich meine eigene Kopie erstellt. Schritte:

Gehen Sie zu den Paketdetails. Bsp: https://pkgs.alpinelinux.org/package/edge/testing/armhf/watchman

Klicken Sie auf den Commit, klicken Sie auf die APKBUILD-Datei-Links und “Log” im Menü, um das Commit-Protokoll der APKBUILD-Datei zu erhalten. Wählen Sie dann einen Commit für Ihre APKBUILD-Datei und laden Sie ihn herunter. Bsp: https://git.alpinelinux.org/cgit/aports/tree/testing/watchman/APKBUILD?id=63f5e7d295659a855709901ce22a3e5f40fce455

Installieren Sie die Build-Tools:

apk -U add alpine-sdk

Sie müssen kein root-Benutzer sein, also erstellen Sie einen packager-Benutzer mit Passwort:

adduser -D packager && addgroup packager abuild
passwd packager

Dann bauen Sie es als packager im gleichen Verzeichnis wie die APKBUILD-Datei:

su - packager
abuild-keygen -a -i
abuild -r

Möglicherweise müssen Sie Fehler herausfinden und Abhängigkeiten installieren. In meinem Beispiel musste ich dies bei meinem vorhandenen Docker-Image als root tun:

apk add python-dev

Nach einem erfolgreichen Build als packager, installieren Sie es als root:

apk add /home/packager/packages/<something...>/watchman-4.7.0-r0.apk --allow-untrusted

Ich bin nicht sicher, wie man den --allow-untrusted-Teil entfernt, aber die Schritte haben bei mir funktioniert.