Comment créer un environnement Linux qui spécifie des versions spécifiques de packages?

9

Je crée un dockerfile qui exécute une application personnalisée liée à une version spécifique de Java.

J'utilise une image de base centos7 parce que c'est ce à quoi faisait référence un article et parce que je dois utiliser quelque chose, c'est donc aussi bon que n'importe quel autre. Honnêtement, je me fiche de l'espace utilisateur que j'utilise. Le point de cette image est le logiciel hébergé, la distribution Linux elle-même n'est qu'un moyen de parvenir à une fin - surtout, le JDK ne sera pas utilisé par d'autres applications ou utilisateurs.

Comme indiqué, mon application est liée à la version spécifique de Java que j'utilise - toute mise à jour de la version Java nécessitera un test de régression complet du logiciel avec cette version spécifique avant sa sortie.

L'article que je suivais a commencé avec les pièces d'installation JDK de dockerfile pertinentes qui ressemblent à ceci:

FROM centos:centos7
RUN yum makecache \
    && yum update -y \
    && yum install -y \
    java-1.8.0-openjdk-devel \
    && yum clean all

Ce n'est pas assez spécifique, chaque fois que les images sont construites, il obtiendra une version aléatoire de Java, ce qui n'est pas ce que je veux, j'ai besoin d'une version spécifique de Java.

J'ai changé le fichier docker pour qu'il ressemble à ceci:

FROM centos:centos7
RUN yum makecache \
    && yum update -y \
    && yum install -y \
    java-1.8.0-openjdk-devel-1.8.0.65-3.b17.el7 \
    && yum clean all

Et l'image de docker se développait bien. C'était en décembre.

Cette semaine, j'ai dû apporter une petite modification à une autre partie du logiciel et reconstruire une nouvelle version de l'image, mais la construction de l'image échoue maintenant.

La construction échoue maintenant parce que cette version spécifique du package java n'est plus disponible (du moins, je pense que c'est ce qu'elle me dit):

Error: Package: 1:java-1.8.0-openjdk-1.8.0.65-3.b17.el7.x86_64 (base)
Requires: java-1.8.0-openjdk-headless = 1:1.8.0.65-3.b17.el7
Available: 1:java-1.8.0-openjdk-headless-1.8.0.65-3.b17.el7.x86_64 (base)
java-1.8.0-openjdk-headless = 1:1.8.0.65-3.b17.el7
Installing: 1:java-1.8.0-openjdk-headless-1.8.0.71-2.b15.el7_2.x86_64 (updates)
java-1.8.0-openjdk-headless = 1:1.8.0.71-2.b15.el7_2

Comment puis-je reconstruire mon dockerfile pour pouvoir toujours utiliser une version spécifique de Java (dans cet exemple, je veux que la version de java soit la version 1.8.0 mise à jour 65)?

Une réponse négative est très bien - si les divers mécanismes de conditionnement Linux en général ne veulent pas que les gens utilisent leurs référentiels comme ça, c'est OK - je peux toujours empaqueter ma propre version du JDK sous forme de fichier zip et décompresser cela quelque part à l'intérieur du environnement dans le cadre de la construction de l'image, mais c'est un tas de tracas que je préférerais ne pas avoir à faire.

Comment les autres font-ils cela? Existe-t-il une autre façon d'installer le JDK afin que je puisse avoir une version récente de la distribution du système d'exploitation avec les dernières mises à jour (telles que définies par l'image de base dans la clause FROM et la mise à jour yum) mais installer une version spécifique du JDK?

Existe-t-il une version Linux plus adaptée à ce type d'exigence (je ne suis pas connecté à CentOS, la distribution Linux utilisateur n'est pas particulièrement importante pour moi)?

Dépouillé
la source
Yum-versionlock serait -il utilisable avec Docker?
Aaron Copley
1
@AaronCopley Je ne pense pas. le verrouillage de version semble être axé sur le fait de s'assurer que la version reste là où elle sera la prochaine fois que vous exécuterez la mise à jour - mais je m'inquiète en fait de ne pas échouer la commande d'installation initiale une fois que le référentiel est passé à une nouvelle version. Je ne prévois plus jamais d'exécuter la mise à jour yum sur cet environnement particulier. Lorsque l'environnement a besoin de nouvelles mises à jour, une nouvelle image de docker sera créée (et je veux que cette image utilise exactement la même version du JDK qu'elle utilise maintenant).
Shorn
1
Désolé, je pense que j'ai mal compris. Vous pouvez voir que la version que vous demandez est dans la base et qu'elle s'installe à partir de mises à jour pour une raison quelconque. Essayezyum install -y $package --disablerepo=updates
Aaron Copley
1
@AaronCopley Oui, cela semble fonctionner - merci! Si vous en faites une réponse, je la marquerai comme réussie. Ou je l'ajouterai moi-même plus tard.
Shorn

Réponses:

2

Il semble qu'il voit le package que vous souhaitez, mais pour une raison quelconque, l'installation s'effectue à partir du référentiel de mises à jour.

Vous pouvez désactiver le référentiel de mises à jour dans votre commande yum;

yum install -y $package --disablerepo=updates
Aaron Copley
la source