Tworzę plik docker, który uruchamia niestandardową aplikację powiązaną z określoną wersją Java.
Używam podstawowego obrazu centos7, ponieważ do tego właśnie się odwoływałem i ponieważ muszę coś użyć, więc jest tak dobry, jak każdy inny. Szczerze mówiąc, nie obchodzi mnie, z jakiego obszaru użytkownika korzystam. Istotą tego obrazu jest hostowane oprogramowanie, sama dystrybucja Linuksa jest tylko środkiem do osiągnięcia celu - co ważne, JDK nie będzie używany przez inne aplikacje ani użytkowników.
Jak już wspomniano, moja aplikacja jest powiązana z określoną wersją Java, której używam - każda aktualizacja wersji Java będzie wymagała pełnego testu regresji oprogramowania z tą konkretną wersją przed jej wydaniem.
Artykuł, który obserwowałem, zaczął od odpowiedniego pliku instalacyjnego JDK pliku dokowania wyglądającego tak:
FROM centos:centos7
RUN yum makecache \
&& yum update -y \
&& yum install -y \
java-1.8.0-openjdk-devel \
&& yum clean all
To nie jest wystarczająco szczegółowe, za każdym razem, gdy obrazy są budowane, otrzyma losową wersję Javy, która nie jest tym, czego chcę, potrzebuję konkretnej wersji Javy.
Zmieniłem plik dokera, aby wyglądał następująco:
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
Obraz dokera budował się dobrze. To było w grudniu.
W tym tygodniu musiałem wprowadzić niewielką zmianę w innej części oprogramowania i odbudować nową wersję obrazu, ale kompilacja obrazu nie powiedzie się.
Kompilacja kończy się teraz niepowodzeniem, ponieważ ta konkretna wersja pakietu java nie jest już dostępna (przynajmniej myślę, że o tym mi mówi):
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
Jak mogę odbudować plik docker, aby zawsze móc używać określonej wersji Java (w tym przykładzie chcę, aby wersja Java była aktualizacją 65.0 1.8.0)?
Odpowiedź negatywna jest w porządku - jeśli różne mechanizmy pakowania Linuksa w ogóle nie chcą, aby ludzie korzystali z takich repozytoriów w ten sposób, to w porządku - zawsze mogę spakować własną wersję JDK jako plik zip i rozpakować ją gdzieś wewnątrz środowisko jako część kompilacji obrazu, ale to mnóstwo kłopotów, których wolałbym nie robić.
Jak robią to inni ludzie? Czy istnieje inny sposób instalacji JDK, dzięki czemu mogę mieć najnowszą wersję dystrybucji systemu operacyjnego z najnowszymi aktualizacjami (zgodnie z definicją obrazu podstawowego w klauzuli FROM i aktualizacji yum), ale zainstalować konkretną wersję JDK?
Czy istnieje wersja dla Linuksa bardziej odpowiednia dla tego rodzaju wymagań (nie jestem przywiązany do CentOS, dystrybucja Linuksa dla użytkowników nie jest dla mnie szczególnie ważna)?
yum install -y $package --disablerepo=updates