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

91

Je Dockerfileconstruis une image Docker basée sur Alpine Linux. Maintenant, je dois installer un paquet dans le cadre de cela 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, de la version en cours d' gitinstallation.

Quelle est la bonne façon de faire cela?

Je suppose que je dois dire updated, upgradeet addquelles versions à utiliser, mais comment dois - je cela?

J'ai vu que cela apkprenait en charge l'épinglage de référentiels, mais ce n'est pas ce que je veux (du moins, je le crois), car je ne veux pas épingler un référentiel, mais un paquet.

En d'autres termes: Si vous gitpouviez installer 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?

Golo Roden
la source

Réponses:

80

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 minimale , 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
kaiser
la source
Êtes-vous sûr que cela fonctionne? D'après ce fil, il semble qu'il ne fasse rien en fait: forum.alpinelinux.org/forum/general-discussion/…
Travis Reeder
2
@TravisR Jetez un coup d'œil à la documentation Alpine APK ici .
Kaiser
Dans mon cas, il a été utile de passer de alpine 3.7 à alpine 3.6!
DUzun
Les plages de tilde de Semver fonctionnent également comme dans le apk add ansible~=2.4.1sens >=2.4.1 <2.5.0. Consultez jubianchi.github.io/semver-check pour tester vos propres gammes.
Mike D
Le référentiel avec la liste des packages disponibles, pkgs.alpinelinux.org/packages , m'a été le plus utile.
Egel
16

À 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
Vlad Frolov
la source
1

Parce que j'utilisais le testingrepo. 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 rootutilisateur, alors créez un packagerutilisateur avec mot de passe:

adduser -D packager && addgroup packager abuild
passwd packager

Puis construisez-le comme packagerdans 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 en tant que root:

apk add python-dev

Après une compilation réussie 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 retirer la --allow-untrustedpièce, mais les étapes ont fonctionné pour moi.

s12chung
la source