web-dev-qa-db-fra.com

Comment installer une version de package spécifique dans Alpine?

J'ai une Dockerfile pour construire une image Docker basée sur Alpine Linux. Maintenant, je dois installer un paquet dans le cadre de cette Dockerfile.

Actuellement j'ai:

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

Apparemment, c'est une mauvaise idée, car le résultat est non déterministe. Au lieu de cela, cela dépend du moment où je construis l'image, quelle version de git est installée.

Quelle est la bonne façon de faire cela?

Je suppose que je dois dire à updated, upgrade et add quelles versions utiliser, mais comment puis-je procéder?

J'ai vu que apk prend en charge l'épinglage des référentiels, mais ce n'est pas ce que je veux (du moins, je le crois), car je ne souhaite pas épingler un référentiel, mais un package.

En d'autres termes: si git pouvait être installé via npm, je pourrais exécuter:

npm install [email protected]

(ou quelle que soit la version que je veux avoir). Quel est l'équivalent pour Alpine Linux?

75
Golo Roden

Vous pouvez définir des versions "collantes" comme ceci:

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

Cela ne mettra à jour les paquets que jusqu'à la version spécifiée. Vous pouvez alors utiliser en toute sécurité…

apk upgrade

mettre à niveau tous les packages, tandis que les packages avec des versions resteront avec leur version. Pour définir une version minimum _, utilisez simplement…

apk add "packagename>1.2.3-suffix"

Si vous ne trouvez pas de paquet et que vous le voyez dans l'interface utilisateur des paquets Alpine, mettez à jour votre base de données sources/paquet:

apk update

Le référentiel de paquets peut être trouvé ici:

https://pkgs.alpinelinux.org/packages
64
kaiser

À l'heure actuelle, il n'existe aucun moyen d'installer d'anciennes versions arbitraires d'un paquet à partir de référentiels officiels sous Alpine Linux. La meilleure chose à faire est d'utiliser les référentiels des versions précédentes:

# 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
13
Vlad Frolov

Parce que j'utilisais le repo testing. J'ai fini par construire ma propre copie. Pas:

Aller aux détails du paquet. Ex:

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

Cliquez sur le commit, cliquez sur les liens du fichier APKBUILD et choisissez "Log" dans le menu pour obtenir le journal de validation du fichier APKBUILD. Choisissez ensuite un commit pour votre fichier APKBUILD et téléchargez-le. Ex:

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

Installez les outils de construction:

apk -U add Alpine-sdk

Vous devez être non-utilisateur root. Créez donc un utilisateur packager avec un mot de passe:

adduser -D packager && addgroup packager abuild
passwd packager

Puis construisez-le en tant que packager dans le même répertoire que le fichier APKBUILD:

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

Vous devrez peut-être résoudre des erreurs et installer des dépendances. Dans mon exemple, je devais le faire sur mon image Docker existante sous la forme root:

apk add python-dev

Après une compilation réussie en tant que packager, installez-le en tant que root:

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

Vous ne savez pas comment supprimer la partie --allow-untrusted, mais les étapes ont fonctionné pour moi.

1
s12chung