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

Hoe installeer ik een specifieke pakketversie in Alpine?

Ik heb een Dockerfile om een Docker-image te bouwen die is gebaseerd op Alpine Linux. Nu moet ik een pakket installeren als onderdeel van deze Dockerfile.

Momenteel heb ik:

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

Blijkbaar is dit een slecht idee, want het resultaat is niet-deterministisch. In plaats daarvan hangt het af van het tijdstip waarop ik de image bouw, welke versie van git geïnstalleerd wordt.

Wat is de juiste manier om dit te doen?

Ik neem aan dat ik updated, upgrade en add moet vertellen welke versies gebruikt moeten worden, maar hoe doe ik dat?

Ik heb gezien dat apk pinning van repositories ondersteunt, maar dat is niet wat ik wil (tenminste dat denk ik), omdat ik niet een repository wil pinnen, maar een package.

Met andere woorden: Als git geïnstalleerd zou kunnen worden via npm, dan zou ik kunnen draaien:

npm install git@1.9.2

(of welke versie ik ook wil hebben). Wat is het equivalent hiervan voor Alpine Linux?

Antwoorden (5)

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

U kunt “sticky” versies als volgt instellen:

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

Dat zal packages alleen upgraden tot de gespecificeerde versie. Je kunt dan veilig …

apk upgrade

gebruiken om alle pakketten te upgraden, terwijl pakketten met versies bij hun versie zullen blijven. Om een minimum versie in te stellen gebruik je gewoon …

apk add "packagename>1.2.3-suffix"

In het geval dat je een package niet kan vinden, terwijl je het wel kan zien in de UI voor Alpine packages, update dan je sources/package database:

apk update

De package repository kan gevonden worden hier :

https://pkgs.alpinelinux.org/packages

Pin nooit pakketten van de “edge” branch van de alpine package repo, aangezien deze in test zijn en ingetrokken kunnen worden. (Bij pkgs.alpinelinux.org/packages , klik op “edge” en verander het naar de alpine image versie die u gebruikt, en klik opnieuw op “zoeken”).

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

Momenteel is er geen manier om willekeurige oudere versies van een pakket uit officiële repositories te installeren in Alpine Linux. Het beste wat je kan bereiken is het gebruiken van repositories van de vroegere 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
1
1
1
2020-02-14 21:42:45 +0000

De syntaxis voor het pinnen van alpine pakketten met apk is apk add packageName==x.y.z.

Echter, wanneer u alpine pakketten in docker images vastzet, moet u voorzichtig zijn om de specifieke versie te gebruiken die overeenkomt met uw image, en de edge tak vermijden.

U kunt de alpine pakketten bekijken op https://pkgs.alpinelinux.org/packages . Jammer genoeg is dit standaard de edge tak, die pakketten bevat die mogelijk herroepen zijn.

Vanaf https://pkgs.alpinelinux.org/packages , typ de naam van het pakket dat u wilt, verander de tak van edge om overeen te komen met de alpine image versie die u gebruikt , en stel de Arch (architectuur) in, en druk dan op search. (Als je de architectuur niet weet, start dan de container en type uname -m.)

Dit zal je de alleen stabiele versie(s) van het pakket laten zien waar je veilig op kunt pinnen. Het vastpinnen van het pakket op een andere versie kan ervoor zorgen dat je Dockerfile op een dag niet meer werkt omdat het pakket wordt verwijderd uit de alpine package repository.

Voorbeeld:

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 heeft het antwoord al gegeven. Ik ben de docker-oplossing aan het schrijven. Ik probeerde een of ander pakket uit de v3.8 repository toe te voegen.

  • Blader door het oude archief http://dl-cdn.alpinelinux.org/alpine/ en haal de specifieke repository versie van je software.
  • Nadat je de versie van de repository hebt, voeg je de versie toe aan je docker bestand
  • Specificeer de exacte versie van je pakket uit de repository
1
1
1
2018-08-21 17:55:01 +0000

Omdat ik de testing repo gebruikte. Ik eindigde met het bouwen van mijn eigen kopie. Stappen:

Ga naar de details van het pakket. Ex: https://pkgs.alpinelinux.org/package/edge/testing/armhf/watchman Klik op de commit, klik op de APKBUILD bestand links en “Log” in het menu om het commit log van het APKBUILD bestand te krijgen. Kies dan een commit voor je APKBUILD bestand en download het. Ex: https://git.alpinelinux.org/cgit/aports/tree/testing/watchman/APKBUILD?id=63f5e7d295659a855709901ce22a3e5f40fce455

Installeer de bouwgereedschappen:

apk -U add alpine-sdk

Je moet geen root user zijn dus maak een packager user aan met wachtwoord:

adduser -D packager && addgroup packager abuild
passwd packager

Bouw dan als packager in dezelfde directory als het APKBUILD bestand:

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

Het kan nodig zijn om fouten uit te zoeken en afhankelijkheden te installeren. In mijn voorbeeld, moest ik dit doen op mijn bestaande Docker image als root:

apk add python-dev

Na een succesvolle build als packager, installeer het als root:

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

Ik weet niet zeker hoe ik het --allow-untrusted gedeelte kan verwijderen, maar de stappen werkten voor mij.