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

Comment installer une version spécifique du paquet dans Alpine ?

Advertisement

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

Actuellement, je l'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 de git qui va être installée.

Quelle est la bonne façon de procéder ?

Je suppose que je dois dire à updated, upgrade et add quelles versions utiliser, mais comment faire ?

J'ai vu que apk permet d'épingler des dépôts, mais ce n'est pas ce que je veux (du moins je le pense), parce que je ne veux pas épingler un dépôt, mais un paquet.

En d'autres termes : Si git pouvait être installé via npm, je serais capable de fonctionner :

npm install git@1.9.2

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

Advertisement

Réponses (5)

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

Vous pouvez définir des versions “collantes” comme celle-ci :

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

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

apk upgrade

pour mettre à jour tous les paquets, tandis que les paquets avec des versions resteront avec leur version. Pour définir une version minimum, utilisez simplement …

apk add "packagename>1.2.3-suffix"

Au cas où vous ne trouveriez pas un paquet, alors que vous pouvez le voir dans l'interface utilisateur pour les paquets Alpine, mettez à jour votre base de données de sources/packages :

apk update

Le dépôt de paquets peut être trouvé ici :

https://pkgs.alpinelinux.org/packages

Ne jamais épingler les paquets de la branche “edge” du dépôt de paquets alpin, car ils sont en test et peuvent être révoqués. (À l'adresse pkgs.alpinelinux.org/packages , cliquez sur “edge” et changez-le pour la version de l'image alpine que vous utilisez, puis cliquez à nouveau sur “search”).

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

Actuellement, il n'y a aucun moyen d'installer des versions arbitrairement anciennes d'un paquet provenant de dépôts officiels dans Alpine Linux. La meilleure chose que vous puissiez faire est d'utiliser les dépôts des versions antérieures :

# 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
Advertisement
1
1
2020-02-14 21:42:45 +0000

La syntaxe pour épingler les paquets alpins avec apk est apk add packageName==x.y.z.

Cependant, lorsque vous épinglez des paquets alpins dans des images docker, vous devez être attentif à utiliser la version spécifique qui correspond à votre image, et éviter la branche edge.

Vous pouvez consulter les paquets alpins sur https://pkgs.alpinelinux.org/packages . Malheureusement, la branche edge, qui contient des paquets pouvant être révoqués, est utilisée par défaut.

À partir de https://pkgs.alpinelinux.org/packages , tapez le nom du paquet que vous voulez, changer la branche edge pour qu'elle corresponde à la version de l'image alpine que vous utilisez , et définissez la branche Arch (architecture), puis appuyez sur search. (Si vous ne connaissez pas l'architecture, lancez le conteneur et tapez uname -m.)

Cela vous montrera la ou les seules versions stables du paquet sur lequel vous pouvez safely pin to. Si vous épinglez le paquet à une version différente, votre Dockerfile peut s'arrêter de fonctionner un jour parce que le paquet a été révoqué du dépôt de paquets alpine.

Exemple :

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 a déjà donné la réponse. Je suis en train d'écrire la solution du docker. J'essayais d'ajouter un paquet du dépôt v3.8.

  • Parcourez l'ancienne archive http://dl-cdn.alpinelinux.org/alpine/ et obtenez la version spécifique du dépôt de votre logiciel.
  • Après avoir obtenu la version du dépôt, ajoutez la version sur votre fichier docker
  • Précisez la version exacte de votre paquet à partir du dépôt
1
Advertisement
1
1
2018-08-21 17:55:01 +0000

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

Allez 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 sur “Log” dans le menu pour obtenir le journal de commit 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 ne devez pas être utilisateur root alors créez un utilisateur packager avec mot de passe :

adduser -D packager && addgroup packager abuild
passwd packager

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

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

Vous devrez peut-être trouver des erreurs et installer des dépendances. Dans mon exemple, j'ai dû faire cela sur mon image Docker existante comme root :

apk add python-dev

Après une compilation réussie en packager, l'installer en root :

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

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

Advertisement