Jak zbudować środowisko Linux, które określa określone wersje pakietów?

9

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)?

Wystrzyżony
źródło
Czy yum-versionlock byłby użyteczny w Dockerze ?
Aaron Copley,
1
@AaronCopley Nie sądzę. Wydaje się, że versionlock koncentruje się na upewnieniu się, że wersja pozostanie tam, gdzie jest następnym razem, gdy uruchomisz aktualizację - ale tak naprawdę jestem zaniepokojony tym, że pierwsza komenda instalacyjna nie zawiedzie po przejściu repozytorium do nowej wersji. Nie planuję nigdy więcej uruchamiać aktualizacji yum w tym konkretnym środowisku. Kiedy środowisko potrzebuje nowych aktualizacji, zostanie zbudowany nowy obraz dokera (i chcę, aby ten obraz używał dokładnie tej samej wersji JDK, co teraz).
Shorn
1
Przepraszam, chyba źle zrozumiałem. Możesz zobaczyć, że żądana wersja jest w bazie i instaluje się z aktualizacji z dowolnego powodu. Spróbujyum install -y $package --disablerepo=updates
Aaron Copley,
1
@AaronCopley Tak, to wydaje się działać - dzięki! Jeśli udzielisz odpowiedzi, oznaczę ją jako udaną. Albo dodam go później.
Shorn

Odpowiedzi:

2

Wygląda na to, że widzi żądany pakiet, ale z jakiegokolwiek powodu instaluje się z repozytorium aktualizacji.

Możesz wyłączyć repozytorium aktualizacji w swoim poleceniu yum;

yum install -y $package --disablerepo=updates
Aaron Copley
źródło