it-swarm.com.de

Wie installiere ich eine bestimmte Paketversion in Alpine?

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

Derzeit habe ich:

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

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

Wie geht das richtig?

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

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

Mit anderen Worten: Wenn git über npm installiert werden könnte, könnte ich Folgendes ausführen:

npm install [email protected]

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

75
Golo Roden

Sie können "Sticky" -Versionen wie folgt festlegen:

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

Dadurch werden Pakete nur bis zur angegebenen Version aktualisiert. Sie können dann sicher verwenden ...

apk upgrade

um alle Pakete zu aktualisieren, während Pakete mit Versionen in ihrer Version bleiben. Um eine Minimum Version festzulegen, benutze einfach…

apk add "packagename>1.2.3-suffix"

Falls Sie ein Paket nicht finden können, während Sie es in der Benutzeroberfläche 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
64
kaiser

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

# 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
13
Vlad Frolov

Weil ich das Repo testing verwendet habe. Am Ende baute ich meine eigene Kopie. Schritte:

Gehen Sie zu den Paketdetails. Ex:

https://pkgs.alpinelinux.org/package/Edge/testing/armhf/watchman

Klicken Sie auf das Festschreiben, klicken Sie auf die Links der APKBUILD-Datei und im Menü auf "Protokoll", um das Festschreibungsprotokoll der APKBUILD-Datei abzurufen. Wählen Sie dann ein Commit für Ihre APKBUILD-Datei und laden Sie es herunter. Ex:

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

Erstellen Sie es dann als packager in demselben Verzeichnis wie die APKBUILD-Datei:

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

Möglicherweise müssen Sie Fehler ermitteln und Abhängigkeiten installieren. In meinem Beispiel musste ich dies auf meinem vorhandenen Docker-Image als root ausführen:

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 ich den --allow-untrusted Teil entfernen soll, aber die Schritte haben bei mir funktioniert.

1
s12chung