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

Jak zainstalować określoną wersję pakietu w Alpine?

Mam Dockerfile do zbudowania obrazu Docker, który jest oparty na Alpine Linux. Teraz muszę zainstalować pakiet jako część 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 od punktu w czasie, w którym buduję obraz, która wersja git jest instalowana.

Jaki jest poprawny sposób na zrobienie tego?

Domyślam się, że muszę powiedzieć updated, upgrade i add, których wersji użyć, ale jak to zrobić?

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

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

npm install git@1.9.2

(lub jakąkolwiek wersję, którą chcę mieć). Jaki jest odpowiednik tego dla Alpine Linux?

Odpowiedzi (5)

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

Możesz ustawić “lepkie” wersje w ten sposób:

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

To uaktualni pakiety tylko do podanej wersji. Możesz wtedy bezpiecznie użyć …

apk upgrade

aby zaktualizować wszystkie pakiety, podczas gdy pakiety z wersjami pozostaną ze swoją wersją. Aby ustawić minimalną wersję po prostu użyj …

apk add "packagename>1.2.3-suffix"

W przypadku gdy nie możesz znaleźć pakietu, podczas gdy możesz go zobaczyć w UI dla pakietów Alpine, zaktualizuj swoją bazę danych źródeł/pakietów:

apk update

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

https://pkgs.alpinelinux.org/packages

Nigdy nie przypinaj pakietów z gałęzi “edge” repo pakietów alpine, ponieważ są one w fazie testów i mogą zostać wycofane. (W pkgs.alpinelinux.org/packages , kliknij “edge” i zmień na wersję obrazu alpine, której używasz, i kliknij “szukaj” ponownie).

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

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

# 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

Składnia dla przypinania pakietów alpejskich z apk to apk add packageName==x.y.z.

Jednakże, kiedy przypinasz pakiety alpejskie w obrazy dockera, musisz być ostrożnym, aby użyć konkretnej wersji, która pasuje do twojego obrazu i unikać gałęzi edge.

Możesz zobaczyć pakiety alpejskie na https://pkgs.alpinelinux.org/packages . Niestety, domyślnie jest to gałąź edge, która zawiera pakiety, które mogą być wycofane.

Z https://pkgs.alpinelinux.org/packages , wpisz nazwę pakietu, który chcesz, zmień gałąź z edge, aby pasowała do wersji obrazu alpine, której używasz , i ustaw Arch (architektura), a następnie naciśnij search. (Jeśli nie znasz architektury, uruchom kontener i wpisz uname -m.)

To pokaże ci jedyną stabilną wersję(y) pakietu, do której możesz bezpiecznie przypiąć pinezkę. Przypinanie pakietu do innej wersji może spowodować, że twój plik Dockerfile przestanie działać pewnego dnia z powodu wycofania pakietu z repozytorium pakietów alpine.

Przykład:

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 już udzielił odpowiedzi. Piszę rozwiązanie dockerowe. Próbowałem dodać jakiś pakiet z repozytorium v3.8.

  • Przeglądaj stare archiwum http://dl-cdn.alpinelinux.org/alpine/ i uzyskaj konkretną wersję repozytorium dla swojego oprogramowania.
  • Po uzyskaniu wersji repozytorium, dodaj wersję do swojego pliku docker
  • Określ dokładną wersję swojego pakietu z repozytorium
1
1
1
2018-08-21 17:55:01 +0000

Ponieważ używałem repo testing. Skończyło się na zbudowaniu własnej kopii. Kroki:

Przejdź do szczegółów pakietu. Ex: https://pkgs.alpinelinux.org/package/edge/testing/armhf/watchman

Kliknij na commit, kliknij na link pliku APKBUILD i “Log” w menu, aby uzyskać log commit pliku APKBUILD. Następnie wybierz commit dla swojego pliku APKBUILD i pobierz go. Ex: https://git.alpinelinux.org/cgit/aports/tree/testing/watchman/APKBUILD?id=63f5e7d295659a855709901ce22a3e5f40fce455

Zainstaluj narzędzia do budowania:

apk -U add alpine-sdk

Musisz być użytkownikiem nie root więc utwórz użytkownika packager z hasłem:

adduser -D packager && addgroup packager abuild
passwd packager

Następnie zbuduj go jako packager w tym samym katalogu co plik APKBUILD:

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

Być może będziesz musiał rozgryźć błędy i zainstalować zależności. W moim przykładzie, musiałem to zrobić na moim istniejącym obrazie Dockera jako root:

apk add python-dev

Po pomyślnym zbudowaniu jako packager, zainstaluj go jako root:

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

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