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

Come installare una versione specifica del pacchetto in Alpine?

Ho un Dockerfile per costruire un'immagine Docker che è basata su Alpine Linux. Ora ho bisogno di installare un pacchetto come parte di questo Dockerfile.

Attualmente ho:

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

Apparentemente questa è una cattiva idea, poiché il risultato non è deterministico. Invece, dipende dal momento in cui costruisco l'immagine, quale versione di git viene installata.

Qual è il modo corretto di farlo?

Immagino che devo dire a updated, upgrade e add quali versioni usare, ma come faccio?

Ho visto che apk supporta il pinning dei repository, ma non è quello che voglio (almeno credo), perché non voglio pinnare un repository, ma un pacchetto.

In altre parole: Se git potesse essere installato tramite npm, sarei in grado di eseguire:

npm install git@1.9.2

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

Risposte (5)

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

Potete impostare versioni “appiccicose” come questa:

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

Che aggiornerà i pacchetti solo fino alla versione specificata. Potete quindi usare tranquillamente …

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 non riusciate a trovare un pacchetto, mentre potete vederlo nell'UI per i pacchetti Alpine, aggiornate il vostro database dei sorgenti/pacchetti:

apk update

Il repository dei pacchetti può essere trovato qui :

https://pkgs.alpinelinux.org/packages

Non pinzare mai i pacchetti dal ramo “edge” del repo dei pacchetti alpini, poiché questi sono in test e possono essere revocati. (A pkgs.alpinelinux.org/packages , clicca su “edge” e cambialo con la versione dell'immagine alpina che usi, e clicca ancora su “search”).

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

Attualmente, non c'è modo di installare versioni arbitrariamente più vecchie 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
1
1
2020-02-14 21:42:45 +0000

La sintassi per appuntare i pacchetti alpini con apk è apk add packageName==x.y.z.

Tuttavia, quando si appuntano i pacchetti alpini nelle immagini Docker, bisogna fare attenzione ad usare la versione specifica che corrisponde alla propria immagine, ed evitare il ramo edge.

Puoi vedere i pacchetti alpini su https://pkgs.alpinelinux.org/packages . Sfortunatamente, questo ha come default il ramo edge, che contiene pacchetti che possono essere revocati.

Da https://pkgs.alpinelinux.org/packages , digita il nome del pacchetto che vuoi, cambia il ramo da edge per corrispondere alla versione dell'immagine alpina che stai usando , e imposta lo Arch (architettura), e poi premi search. (Se non conoscete l'architettura, eseguite il contenitore e digitate uname -m.)

Questo vi mostrerà la sola versione(i) stabile(i) ** del pacchetto che potete **sicuramente appuntare. Appuntare il pacchetto ad una versione diversa può causare che il tuo Dockerfile smetta di funzionare un giorno a causa della revoca del pacchetto dal repository dei pacchetti alpini.

Esempio:

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 ha già dato la risposta. Sto scrivendo la soluzione docker. Stavo cercando di aggiungere qualche pacchetto dal repository v3.8.

  • Sfoglia il vecchio archivio http://dl-cdn.alpinelinux.org/alpine/ e ottieni la versione specifica del repository del tuo software.
  • Dopo aver ottenuto la versione del repository, aggiungi la versione sul tuo file docker
  • Specifica la versione esatta del tuo pacchetto dal repository
1
1
1
2018-08-21 17:55:01 +0000

Perché stavo usando il repo testing. Ho finito per costruire la mia copia. Passi:

Vai ai dettagli del pacchetto. Es: https://pkgs.alpinelinux.org/package/edge/testing/armhf/watchman

Clicca sul commit, clicca sui link dei file APKBUILD e “Log” sul menu per ottenere il log del commit del file APKBUILD. Poi scegli un commit per il tuo file APKBUILD e scaricalo. Es: https://git.alpinelinux.org/cgit/aports/tree/testing/watchman/APKBUILD?id=63f5e7d295659a855709901ce22a3e5f40fce455

Installare gli strumenti di compilazione:

apk -U add alpine-sdk

Hai bisogno di non essere utente root quindi crea un utente packager con password:

adduser -D packager && addgroup packager abuild
passwd packager

Poi costruisci come packager nella stessa directory del file APKBUILD:

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

Potresti aver bisogno di capire gli errori e installare le dipendenze. Nel mio esempio, avevo bisogno di farlo sulla mia immagine Docker esistente come root:

apk add python-dev

Dopo una build di successo come packager, installala come root:

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

Non sono sicuro di come rimuovere la parte --allow-untrusted, ma i passi hanno funzionato per me.