Wie installiere ich eine bestimmte Paketversion in Alpine?

90

Ich muss ein DockerfileDocker-Image erstellen, das auf Alpine Linux basiert. Jetzt muss ich ein Paket als Teil davon installieren Dockerfile.

Derzeit habe ich:

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

Anscheinend ist dies eine schlechte Idee, da das Ergebnis nicht deterministisch ist. Stattdessen kommt es darauf an, zu welchem ​​Zeitpunkt ich das Image erstelle und welche Version von gitinstalliert wird.

Wie geht das richtig?

Ich denke, dass ich sagen muss updated, upgradeund addwelche Versionen ich verwenden soll, aber wie mache ich das?

Ich habe gesehen, dass es apkdas 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 installiert werden könnte npm, 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?

Golo Roden
quelle

Antworten:

79

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. Verwenden Sie zum Festlegen einer Mindestversion 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
Kaiser
quelle
Sind Sie sicher, dass dies funktioniert? Aus diesem Thread geht hervor, dass es eigentlich nichts bringt: forum.alpinelinux.org/forum/general-discussion/…
Travis Reeder
2
@TravisR Sehen Sie sich hier die Alpine APK-Dokumente an .
Kaiser
In meinem Fall hat es geholfen, einfach von Alpine 3.7 auf Alpine 3.6 herunterzustufen!
DUzun
Semver-Tilde-Bereiche funktionieren ebenfalls apk add ansible~=2.4.1sinngemäß >=2.4.1 <2.5.0. Schauen Sie sich jubianchi.github.io/semver-check an, um Ihre eigenen Reichweiten zu testen.
Mike D
Das Repo mit der Liste der verfügbaren Pakete pkgs.alpinelinux.org/packages war für mich am hilfreichsten.
Egel
16

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
Vlad Frolov
quelle
1

Weil ich das testingRepo benutzt 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 klicken Sie 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 rootBenutzer sein, also erstellen Sie einen packagerBenutzer mit Passwort:

adduser -D packager && addgroup packager abuild
passwd packager

Dann erstellen Sie es packagerim selben 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 ausführen als root:

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

s12chung
quelle