Como crio um ambiente Linux que especifica versões específicas de pacotes?

9

Estou criando um arquivo docker que executa um aplicativo personalizado vinculado a uma versão específica do Java.

Estou usando uma imagem base do centos7 porque é a esse artigo que eu estava me referindo e porque tenho que usar alguma coisa, então é tão bom quanto qualquer outro. Sinceramente, não me importo com o que eu estou usando. O ponto desta imagem é o software que está sendo hospedado, a própria distribuição Linux é apenas um meio para atingir um fim - o importante é que o JDK não será usado por outros aplicativos ou usuários.

Conforme declarado, meu aplicativo está vinculado à versão específica do Java que estou usando - qualquer atualização para a versão Java exigirá um teste de regressão completo do software com essa versão específica antes de ser lançado.

O artigo que eu estava seguindo começou com as peças de instalação relevantes do dockerfile JDK, parecidas com esta:

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

Isso não é específico o suficiente, sempre que as imagens são construídas, ela obtém uma versão aleatória do Java, que não é o que eu quero, preciso de uma versão específica do Java.

Mudei o arquivo docker para ficar assim:

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 a imagem do docker estava se desenvolvendo bem. Isso foi em dezembro.

Nesta semana, precisei fazer uma pequena alteração em uma parte diferente do software e reconstruir uma nova versão da imagem, mas a criação da imagem agora falha.

A construção falha agora porque essa versão específica do pacote java não está mais disponível (pelo menos, acho que é isso que está me dizendo):

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

Como posso reconstruir meu arquivo docker para poder sempre usar uma versão específica do Java (neste exemplo, quero que a versão do java seja 1.8.0, atualização 65)?

Uma resposta negativa é boa - se os vários mecanismos de empacotamento do Linux em geral não querem que as pessoas usem seus repositórios assim, tudo bem - eu sempre posso empacotar minha própria versão do JDK como um arquivo zip e descompactar em algum lugar dentro do diretório ambiente como parte da construção da imagem, mas é um monte de problemas que eu preferiria não ter que fazer.

Como as outras pessoas fazem isso? Existe uma maneira diferente de instalar o JDK para que eu possa ter uma versão recente da distribuição do SO com as atualizações mais recentes (conforme definido pela imagem base na cláusula FROM e na atualização yum), mas instalar uma versão específica do JDK?

Existe uma versão do Linux mais adequada para esse tipo de requisito (não estou casada com o CentOS, a distribuição Linux do usuário não é particularmente importante para mim)?

Shorn
fonte
O yum-versionlock pode ser usado com o Docker?
Aaron Copley
11
@AaronCopley Acho que não. O versionlock parece estar focado em garantir que a versão permaneça onde está na próxima vez que você executar a atualização - mas estou realmente preocupado em fazer com que o comando de instalação inicial não falhe depois que o repositório passar para uma nova versão. Não pretendo executar a atualização yum nesse ambiente específico novamente. Quando o ambiente precisar de novas atualizações, uma nova imagem do Docker será criada (e eu quero que essa imagem use exatamente a mesma versão do JDK que está usando agora).
Shorn
11
Desculpe, acho que não entendi. Você pode ver a versão que você está solicitando está na base e está instalando a partir de atualizações por qualquer motivo. Tenteyum install -y $package --disablerepo=updates
Aaron Copley
11
@AaronCopley Sim, isso parece funcionar - obrigado! Se você der uma resposta, vou marcar com sucesso. Ou eu mesmo adicionarei depois.
Shorn

Respostas:

2

Parece que ele vê o pacote que você deseja, mas, por qualquer motivo, está instalando a partir do repositório de atualizações.

Você pode desativar o repositório de atualizações no seu comando yum;

yum install -y $package --disablerepo=updates
Aaron Copley
fonte