Wie erstelle ich eine Linux-Umgebung, die bestimmte Versionen von Paketen angibt?

9

Ich erstelle eine Docker-Datei, in der eine benutzerdefinierte Anwendung ausgeführt wird, die an eine bestimmte Java-Version gebunden ist.

Ich verwende ein Centos7-Basis-Image, weil es das ist, was ein Artikel verwendet, auf den ich mich bezog, und weil ich etwas verwenden muss, also ist das so gut wie jedes andere. Es ist mir ehrlich gesagt egal, welches Userland ich benutze. Der Punkt dieses Images ist die gehostete Software, die Linux-Distribution selbst ist nur ein Mittel zum Zweck - wichtig ist, dass das JDK nicht von anderen Anwendungen oder Benutzern verwendet wird.

Wie bereits erwähnt, ist meine Anwendung an die von mir verwendete Java-Version gebunden. Für jedes Update der Java-Version ist ein vollständiger Regressionstest der Software mit dieser bestimmten Version erforderlich, bevor sie veröffentlicht wird.

Der Artikel, dem ich folgte, begann mit den relevanten Dockerfile JDK-Installationsteilen, die folgendermaßen aussehen:

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

Das ist nicht spezifisch genug. Jedes Mal, wenn die Bilder erstellt werden, wird eine zufällige Version von Java angezeigt. Dies ist nicht das, was ich möchte. Ich benötige eine bestimmte Version von Java.

Ich habe die Docker-Datei so geändert, dass sie folgendermaßen aussieht:

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

Und das Docker-Image war in Ordnung. Das war im Dezember.

Diese Woche musste ich eine kleine Änderung an einem anderen Teil der Software vornehmen und eine neue Version des Images neu erstellen, aber die Image-Erstellung schlägt jetzt fehl.

Der Build schlägt jetzt fehl, weil diese bestimmte Version des Java-Pakets nicht mehr verfügbar ist (zumindest denke ich, dass es das ist, was es mir sagt):

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

Wie kann ich meine Docker-Datei neu erstellen, damit ich immer eine bestimmte Java-Version verwenden kann (in diesem Beispiel soll die Java-Version 1.8.0 Update 65 sein)?

Eine negative Antwort ist in Ordnung - wenn die verschiedenen Linux-Verpackungsmechanismen im Allgemeinen nicht möchten, dass Benutzer ihre Repositorys so verwenden, ist das in Ordnung - ich kann meine eigene Version des JDK immer als Zip-Datei verpacken und diese einfach irgendwo in der Datei entpacken Umgebung als Teil des Image-Builds, aber das ist ein Haufen Ärger, den ich lieber nicht machen müsste.

Wie machen andere das? Gibt es eine andere Möglichkeit, das JDK zu installieren, damit ich eine aktuelle Version der Betriebssystemdistribution mit den neuesten Updates haben kann (wie durch das Basisimage in der FROM-Klausel und das yum-Update definiert), aber eine bestimmte Version des JDK installieren kann?

Gibt es eine Linux-Version, die für diese Art von Anforderung besser geeignet ist (ich bin nicht mit CentOS verbunden, die Userland-Linux-Distribution ist für mich nicht besonders wichtig)?

Geschoren
quelle
Wäre yum-versionlock mit Docker verwendbar?
Aaron Copley
1
@ AaronCopley Ich glaube nicht. versionlock scheint darauf ausgerichtet zu sein, sicherzustellen, dass die Version beim nächsten Ausführen des Updates dort bleibt, wo sie ist. Ich bin jedoch besorgt darüber, dass der Befehl zur Erstinstallation nicht fehlschlägt, sobald das Repository auf eine neue Version umgestellt wurde. Ich habe nicht vor, jemals wieder ein yum-Update für diese bestimmte Umgebung auszuführen. Wenn die Umgebung neue Updates benötigt, wird ein neues Docker-Image erstellt (und ich möchte, dass dieses Image genau dieselbe Version des JDK verwendet, die es jetzt verwendet).
Geschoren
1
Entschuldigung, ich glaube ich habe falsch verstanden. Sie können sehen, dass sich die von Ihnen angeforderte Version in der Basis befindet und aus irgendeinem Grund von Updates installiert wird . Versuchen Sieyum install -y $package --disablerepo=updates
Aaron Copley
1
@ AaronCopley Ja, das scheint zu funktionieren - danke! Wenn Sie eine Antwort geben, werde ich sie als erfolgreich markieren. Oder ich füge es später selbst hinzu.
Geschoren

Antworten:

2

Es sieht so aus, als würde das gewünschte Paket angezeigt, aber aus irgendeinem Grund wird es aus dem Update-Repository installiert.

Sie können das Update-Repository in Ihrem yum-Befehl deaktivieren.

yum install -y $package --disablerepo=updates
Aaron Copley
quelle