Come faccio a creare un ambiente Linux che specifica versioni specifiche di pacchetti?


9

Sto creando un file docker che esegue un'applicazione personalizzata collegata a una versione specifica di Java.

Sto usando un'immagine di base di centos7 perché è quello che un articolo a cui mi riferivo stava usando e perché devo usare qualcosa, quindi è buono come qualsiasi altro. Onestamente non mi interessa quale userland sto usando. Il punto di questa immagine è il software ospitato, la distribuzione Linux stessa è solo un mezzo per raggiungere un obiettivo - cosa importante, il JDK non verrà utilizzato da altre applicazioni o utenti.

Come detto, la mia applicazione è legata alla versione specifica di Java che sto utilizzando: qualsiasi aggiornamento alla versione Java richiederà un test di regressione completo del software con quella versione specifica prima che venga rilasciato.

L'articolo che stavo seguendo è iniziato con le relative parti di installazione JDK Dockerfile che appaiono così:

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

Non è abbastanza specifico, ogni volta che le immagini vengono create otterrà una versione casuale di Java, che non è quello che voglio, ho bisogno di una versione specifica di Java.

Ho modificato il file docker in questo modo:

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

E l'immagine della finestra mobile stava andando bene. Era a dicembre.

Questa settimana, ho dovuto apportare una piccola modifica a una parte diversa del software e ricostruire una nuova versione dell'immagine, ma la creazione dell'immagine ora non riesce.

La compilazione non riesce ora perché quella versione specifica del pacchetto java non è più disponibile (almeno, penso che sia quello che mi sta dicendo):

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

Come posso ricostruire il mio file docker in modo da poter sempre utilizzare una versione specifica di Java (in questo esempio, voglio che la versione di java sia l'aggiornamento 1.8.0 65 65)?

Una risposta negativa va bene - se i vari meccanismi di impacchettamento di Linux in generale non vogliono che le persone usino i loro repository in questo modo, va bene - Posso sempre impacchettare la mia versione di JDK come file zip e decomprimerlo da qualche parte all'interno del ambiente come parte della creazione dell'immagine, ma è una seccatura che preferirei non dover fare.

Come lo fanno gli altri? Esiste un modo diverso di installare JDK in modo da poter disporre di una versione recente della distribuzione del sistema operativo con gli ultimi aggiornamenti (come definito dall'immagine di base nella clausola FROM e l'aggiornamento yum) ma installare una versione specifica di JDK?

Esiste una versione Linux più adatta a questo tipo di requisiti (non sono legata a CentOS, la distribuzione Linux di userland non è particolarmente importante per me)?


Sarebbe Yum-versionlock da utilizzabile con Docker?
Aaron Copley,

1
@AaronCopley Non la penso così. Il blocco versione sembra focalizzato sull'assicurarsi che la versione rimanga dove si trova la prossima volta che esegui l'aggiornamento, ma in realtà sono preoccupato che il comando di installazione iniziale non fallisca una volta che il repository è passato a una nuova versione. Non ho intenzione di eseguire mai più l'aggiornamento yum su quel particolare ambiente. Quando l'ambiente necessita di nuovi aggiornamenti, verrà creata una nuova immagine docker (e voglio che quell'immagine utilizzi esattamente la stessa versione di JDK che sta usando ora).
Inviato il

1
Scusa, penso di aver frainteso. Puoi vedere che la versione che stai richiedendo è nella base e si sta installando dagli aggiornamenti per qualsiasi motivo. Provayum install -y $package --disablerepo=updates
Aaron Copley,

1
@AaronCopley Sì, sembra funzionare - grazie! Se lo fai una risposta, lo segnerò con successo. O lo aggiungerò io più tardi.
Inviato il

Risposte:


2

Sembra che veda il pacchetto desiderato, ma per qualsiasi motivo viene installato dal repository degli aggiornamenti.

È possibile disabilitare il repository degli aggiornamenti nel comando yum;

yum install -y $package --disablerepo=updates
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.