定制 Docker 图像与 Stock/Legacy Docker 图像

Bespoke Docker Image vs Stock/Legacy Docker Image

今天,在对我的 CI/CD 脚本进行代码审查时,我感到很吃惊。我的同伴有以下问题。

None 其中是原创内容,但改编自 Szymon Stepniak 的博客 [https://e.printstacktrace.blog/using-sdkman-as-a-docker-image-for-jenkins-pipeline-a-step-by-step-guide/]

基本上我有一个 Maven 3.5.4 和 Java 7.x.x-zulu 的图像。我还使用非 root 用户设置了它。使用 Maven 所需的 .m2 文件夹 + settings.xml。它帮我构建了这个遗留 WAR 文件。

但是,我被告知放弃创建略微修改的 docker 图像的想法,并使用已经制作好的图像,即 maven:3.2.5-jdk-7u65

问题 1. 我使用的是官方图片 debian:stretch-slim 并稍作修改。至少,我的 Dockerfile 会说明我的图像发生了什么。所以,它的所有出处都是众所周知的。那么,为什么这种做法不受欢迎?

问题 2. 我在 docker 集线器上找不到此图像 maven:3.2.5-jdk-7u65 作为安全和官方图像使用 ?

问题 3. 当我使用 maven:3.2.5-jdk-7u65 时,它抱怨该图像已被弃用,但继续,它还抱怨一些 public gpg密钥未使用,但继续使用,Maven 构建失败。 maven:3.2.5

基本没有涵盖我使用的POM指令

我应该做什么以及我应该如何处理这个任务? 什么是最佳实践? 为什么我找不到许多官方遗留 maven + 遗留 jdk6,7 图像?

有很多“视情况而定”,其中可能取决于您当地的法律合规要求。我会建议:

  1. 使用 当前 版本的 Docker Hub 图片,如果允许的话;否则
  2. 根据已知且允许的分发基础映像构建映像

关于 Docker Hub 图像需要注意的一件事是它们支持一组特定的版本,除此之外的版本根本不会重建。考虑 maven image:那里有 maven:3.8.5 的各种变体。如果您构建镜像 FROM maven:3 并且 docker build --pull 那么您将在 Maven 和基础 Linux 分发镜像中获得更新。如果你命名一个 super-specific FROM maven:3.8.3 那么它将永远不会被重建,即使底层 Linux 发行版或 JVM 有一个关键的安全更新。

您可能会在找到的 maven:3.2.5-jdk-7u65 图片中看到其中的一些内容。该图像存在于 Docker Hub 上,但已经很长时间没有重建了。 (就此而言,即使是最古老的 openjdk image 也是基于 Java 8。)因此,如果您真的愿意,您可能可以使用它,但我不会将其视为可靠或维护。

因此,如果您确实需要非常非常旧的 Java 版本(end-of-lifed in just a couple of months) I'd suggest the approach you have now is the best one: start FROM a reasonably current Linux distribution that gets security updates, download the newest version you can (it looks like Java 7u80 是公开可用的,而 7u331 是付费订阅的)并偶尔重建它.当更新发布时以及基础 Linux 映像获得更新时,您将需要进行更新,但这将比您发现的未维护映像获得的更新更多。