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)?
yum install -y $package --disablerepo=updates