Come installare una versione del pacchetto specifica in Alpine?


91

Devo Dockerfilecreare un'immagine Docker basata su Alpine Linux. Ora devo installare un pacchetto come parte di questo Dockerfile.

Attualmente ho:

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

Apparentemente questa è una cattiva idea, in quanto il risultato non è deterministico. Invece, dipende dal momento in cui creo l'immagine, quale versione di gitviene installata.

Qual è il modo corretto di farlo?

Credo che devo dire updated, upgradee addquali versioni da usare, ma come faccio a fare questo?

Ho visto che apksupporta il pinning dei repository, ma non è quello che voglio (almeno lo penso), perché non voglio aggiungere un repository, ma un pacchetto.

In altre parole: se gitpotesse essere installato tramite npm, sarei in grado di eseguire:

npm install git@1.9.2

(o qualsiasi versione che voglio avere). Qual è l'equivalente di questo per Alpine Linux?

Risposte:


80

Puoi impostare versioni "adesive" come questa:

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

Ciò aggiornerà i pacchetti solo fino alla versione specificata. È quindi possibile utilizzare in modo sicuro ...

apk upgrade

per aggiornare tutti i pacchetti, mentre i pacchetti con versioni rimarranno con la loro versione. Per impostare una versione minima basta usare ...

apk add "packagename>1.2.3-suffix"

Nel caso in cui non sia possibile trovare un pacchetto, mentre è possibile visualizzarlo nell'interfaccia utente per i pacchetti Alpine, aggiornare il database dei sorgenti / pacchetti:

apk update

Il repository dei pacchetti è disponibile qui :

https://pkgs.alpinelinux.org/packages

Sei sicuro che funzioni? Da questa discussione, sembra che in realtà non faccia nulla: forum.alpinelinux.org/forum/general-discussion/…
Travis Reeder

2
@TravisR Dai un'occhiata ai documenti Alpine APK qui .
Kaiser,

Nel mio caso, mi ha aiutato a passare da Alpine 3.7 a Alpine 3.6!
DUzun,

Anche le gamme di tilde semver funzionano come nel apk add ansible~=2.4.1significato >=2.4.1 <2.5.0. Scopri jubianchi.github.io/semver-check per testare le proprie gamme.
Mike D,

Il repository con l'elenco dei pacchetti disponibili pkgs.alpinelinux.org/packages è stato il più utile per me.
Egel,

16

Attualmente, non è possibile installare versioni precedenti arbitrarie di un pacchetto dai repository ufficiali in Alpine Linux. La cosa migliore che puoi ottenere è usare i repository delle versioni precedenti:

# 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

Perché stavo usando il testingrepository. Ho finito per costruire la mia copia. passi:

Vai ai dettagli del pacchetto. Ex:

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

Fare clic sul commit, fare clic sui collegamenti al file APKBUILD e su "Log" dal menu per ottenere il registro del commit del file APKBUILD. Quindi scegli un commit per il tuo file APKBUILD e scaricalo. Ex:

https://git.alpinelinux.org/cgit/aports/tree/testing/watchman/APKBUILD?id=63f5e7d295659a855709901ce22a3e5f40fce455

Installa gli strumenti di compilazione:

apk -U add alpine-sdk

Non devi essere un rootutente, quindi crea un packagerutente con password:

adduser -D packager && addgroup packager abuild
passwd packager

Quindi packagercompilalo come nella stessa directory del file APKBUILD:

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

Potrebbe essere necessario capire gli errori e installare le dipendenze. Nel mio esempio, dovevo farlo sull'immagine Docker esistente come root:

apk add python-dev

Dopo aver compilato correttamente come packager, installalo come root:

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

Non sono sicuro di come rimuovere la --allow-untrustedparte, ma i passaggi hanno funzionato per me.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.