Jak zainstalować konkretną wersję pakietu w Alpine?

89

Mam Dockerfilezbudować obraz Dockera oparty na systemie Alpine Linux. Teraz muszę zainstalować pakiet w ramach tego Dockerfile.

Obecnie mam:

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

Najwyraźniej jest to zły pomysł, ponieważ wynik jest niedeterministyczny. Zamiast tego zależy to od momentu, w którym zbuduję obraz, którą wersję gitinstaluję.

Jaki jest właściwy sposób to zrobić?

Myślę, że muszę powiedzieć updated, upgradei addktóre wersje w użyciu, ale jak mam to zrobić?

Widziałem, że apkobsługuje przypinanie repozytoriów, ale nie tego chcę (przynajmniej tak mi się wydaje), ponieważ nie chcę przypinać repozytorium, ale pakiet.

Innymi słowy: Gdyby gitmożna było zainstalować przez npm, byłbym w stanie uruchomić:

npm install [email protected]

(lub jakąkolwiek wersję chcę mieć). Co to jest równoważne z Alpine Linux?

Golo Roden
źródło

Odpowiedzi:

78

Możesz ustawić wersje „lepkie” w następujący sposób:

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

Spowoduje to aktualizację pakietów tylko do określonej wersji. Następnie możesz bezpiecznie używać…

apk upgrade

zaktualizować wszystkie pakiety, a pakiety z wersjami pozostaną z ich wersją. Aby ustawić minimalną wersję, użyj…

apk add "packagename>1.2.3-suffix"

Jeśli nie możesz znaleźć pakietu, a możesz go zobaczyć w interfejsie użytkownika dla pakietów Alpine, zaktualizuj bazę danych źródeł / pakietów:

apk update

Repozytorium pakietów można znaleźć tutaj :

https://pkgs.alpinelinux.org/packages
kajzer
źródło
Jesteś pewien, że to działa? Z tego wątku wynika, że ​​tak naprawdę nic nie robi: forum.alpinelinux.org/forum/general-discussion/…
Travis Reeder
2
@TravisR Spójrz na dokumenty Alpine APK tutaj .
kaiser
W moim przypadku pomogło to obniżyć wersję z alpejskiej 3.7 do alpejskiej 3.6!
DUzun,
Zakresy tyldy Semvera działają również w apk add ansible~=2.4.1znaczeniu >=2.4.1 <2.5.0. Sprawdź jubianchi.github.io/semver-check, aby przetestować własne zakresy.
Mike D
Repo z listą dostępnych pakietów pkgs.alpinelinux.org/packages było dla mnie najbardziej pomocne.
Egel,
16

Obecnie nie ma możliwości zainstalowania dowolnych starszych wersji pakietu z oficjalnych repozytoriów w Alpine Linux. Najlepszą rzeczą, jaką możesz osiągnąć, jest użycie repozytoriów wcześniejszych wersji:

# 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
źródło
1

Ponieważ korzystałem z testingrepozytorium. Skończyłem budować własną kopię. Kroki:

Przejdź do szczegółów paczki. Dawny:

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

Kliknij zatwierdzenie, kliknij łącza pliku APKBUILD i „Log” w menu, aby uzyskać dziennik zatwierdzenia pliku APKBUILD. Następnie wybierz zatwierdzenie dla pliku APKBUILD i pobierz go. Dawny:

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

Zainstaluj narzędzia do kompilacji:

apk -U add alpine-sdk

Nie musisz być rootużytkownikiem, więc utwórz packagerużytkownika z hasłem:

adduser -D packager && addgroup packager abuild
passwd packager

Następnie skompiluj go jak packagerw tym samym katalogu, co plik APKBUILD:

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

Konieczne może być wykrycie błędów i zainstalowanie zależności. W moim przykładzie musiałem to zrobić na moim istniejącym obrazie Docker jako root:

apk add python-dev

Po udanej kompilacji jako packagerzainstaluj ją jako root:

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

Nie jestem pewien, jak usunąć --allow-untrustedczęść, ale kroki zadziałały dla mnie.

s12chung
źródło