我正在创建一个 dockerfile,它运行与特定版本的 Java 绑定的自定义应用程序。
我使用的是 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
docker 镜像构建得很好。那是 12 月的事了。
本周,我需要对软件的不同部分做一些小的改动并重建新版本的图像,但现在图像构建失败。
现在构建失败,因为该特定版本的 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,以便我可以拥有最新版本的 OS 发行版和最新更新(由 FROM 子句中的基础映像和 yum update 定义),但安装特定版本的 JDK?
是否有更适合这种要求的 Linux 版本(我并不执着于 CentOS,用户空间 Linux 发行版对我来说并不是特别重要)?
答案1
它看起来看到了您想要的包,但无论出于什么原因,都是从更新存储库进行安装。
您可以在 yum 命令中禁用更新存储库;
yum install -y $package --disablerepo=updates