Linux

如何建構指定特定軟體包版本的 Linux 環境?

  • February 18, 2016

我正在創建一個執行與特定 Java 版本相關的自定義應用程序的 dockerfile。

我使用的是 centos7 基礎鏡像,因為這就是我所指的一篇文章正在使用的內容,並且因為我必須使用一些東西,所以它和任何東西一樣好。老實說,我不在乎我使用的是什麼使用者空間。這個圖像的重點是託管的軟體,Linux 發行版本身只是達到目的的一種手段——重要的是,JDK 不會被其他應用程序或使用者使用。

如前所述,我的應用程序與我正在使用的特定 Java 版本相關聯 - 對 Java 版本的任何更新都需要在發布之前對該特定版本的軟體進行完整的回歸測試。

我關注的文章從相關的 dockerfile JDK 安裝部分開始,如下所示:

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

這還不夠具體,任何時候建構圖像都會得到一個隨機版本的 Java,這不是我想要的,我需要一個特定版本的 Java。

我將 docker 文件更改為如下所示:

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

泊塢窗圖像建構良好。那是在十二月。

本週,我需要對軟體的不同部分進行小改動並重建新版本的映像,但現在映像建構失敗。

現在建構失敗了,因為該特定版本的 java 包不再可用(至少,我認為這就是它告訴我的):

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

如何重建 dockerfile 以便始終使用特定版本的 Java(在此範例中,我希望 Java 版本為 1.8.0 update 65)?

一個否定的答案很好 - 如果各種 Linux 打包機制一般不希望人們像這樣使用他們的儲存庫,那沒關係 - 我總是可以將我自己的 JDK 版本打包為一個 zip 文件,然後在裡面的某個地方解壓環境作為圖像建構的一部分,但這是我不想做的一堆麻煩。

其他人如何做到這一點?是否有不同的安裝 JDK 的方法,以便我可以擁有具有最新更新(由 FROM 子句中的基本映像和 yum 更新定義)的最新版本的 OS 發行版,但安裝特定版本的 JDK?

有沒有更適合這種需求的 Linux 版本(我不喜歡 CentOS,使用者態 Linux 發行版對我來說不是特別重要)?

看起來它看到了您想要的包,但無論出於何種原因,它都是從更新儲存庫安裝的。

您可以在 yum 命令中禁用更新儲存庫;

yum install -y $package --disablerepo=updates

引用自:https://serverfault.com/questions/757983