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?
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
À 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
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:
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.