¿Cómo construyo un entorno Linux que especifique versiones específicas de paquetes?


9

Estoy creando un dockerfile que ejecuta una aplicación personalizada que está vinculada a una versión específica de Java.

Estoy usando una imagen base centos7 porque eso es lo que estaba usando un artículo al que me refería y porque tengo que usar algo, así que es tan bueno como cualquier otro. Sinceramente, no me importa qué país de usuario estoy usando. El objetivo de esta imagen es el software alojado, la distribución de Linux en sí misma es solo un medio para un fin; lo que es más importante, el JDK no será utilizado por otras aplicaciones o usuarios.

Como se indicó, mi aplicación está vinculada a la versión específica de Java que estoy usando; cualquier actualización de la versión de Java requerirá una prueba de regresión completa del software con esa versión específica antes de su lanzamiento.

El artículo que estaba siguiendo comenzó con las partes de instalación JDK de dockerfile relevantes que se ven así:

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

Eso no es lo suficientemente específico, cada vez que se construyen las imágenes obtendrá una versión aleatoria de Java, que no es lo que quiero, necesito una versión específica de Java.

Cambié el archivo acoplable para que se vea así:

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

Y la imagen de la ventana acoplable se estaba construyendo bien. Eso fue en diciembre.

Esta semana, necesitaba hacer un pequeño cambio en una parte diferente del software y reconstruir una nueva versión de la imagen, pero la construcción de la imagen ahora falla.

La compilación falla ahora porque esa versión específica del paquete java ya no está disponible (al menos, creo que eso es lo que me dice):

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

¿Cómo puedo reconstruir mi dockerfile para que siempre pueda usar una versión específica de Java (en este ejemplo, quiero que la versión de Java sea 1.8.0 actualización 65)?

Una respuesta negativa está bien: si los diversos mecanismos de empaquetado de Linux en general no quieren que las personas usen sus repositorios de esta manera, está bien, siempre puedo empaquetar mi propia versión del JDK como un archivo zip y simplemente descomprimirlo en algún lugar dentro del entorno como parte de la creación de la imagen, pero eso es una molestia que preferiría no tener que hacer.

¿Cómo hacen esto otras personas? ¿Hay una forma diferente de instalar el JDK para que pueda tener una versión reciente de la distribución del sistema operativo con las últimas actualizaciones (según lo definido por la imagen base en la cláusula FROM y la actualización de yum) pero instalar una versión específica del JDK?

¿Existe una versión de Linux más adecuada para este tipo de requisitos (no estoy casado con CentOS, la distribución de Linux del usuario no es particularmente importante para mí)?


¿ Yum-versionlock se puede usar con Docker?
Aaron Copley

1
@AaronCopley No lo creo. versionlock parece estar enfocado en asegurarse de que la versión permanezca donde está la próxima vez que ejecute la actualización, pero en realidad me preocupa hacer que el comando de instalación inicial no falle una vez que el repositorio se haya movido a una nueva versión. No planeo volver a ejecutar Yum Update en ese entorno en particular. Cuando el entorno necesite nuevas actualizaciones, se creará una nueva imagen acoplable (y quiero que esa imagen use exactamente la misma versión del JDK que está usando ahora).
Cortado

1
Lo siento, creo que entendí mal. Puede ver que la versión que solicita está en la base y se está instalando a partir de actualizaciones por cualquier motivo. Pruebayum install -y $package --disablerepo=updates
Aaron Copley

1
@AaronCopley Sí, eso parece funcionar, ¡gracias! Si responde, lo marcaré como exitoso. O lo agregaré yo mismo más tarde.
Shorn

Respuestas:


2

Parece que ve el paquete que desea, pero por cualquier razón se está instalando desde el repositorio de actualizaciones.

Puede deshabilitar el repositorio de actualizaciones en su comando yum;

yum install -y $package --disablerepo=updates
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.