在 docker 文件中使用 2 FROM:alpine-java-python 和 python3 删除已安装的 java?

Using 2 FROM in docker file: alpine-java-python and python3 removes installed java?

在我的项目中,我需要 java 和 python3。 我在 Dockerfile 中使用了 2 个 FROM 语句。

FROM docker.<xx>.com/alpine-java-python
......
......
FROM python3
......
......
CMD [ "java", "-jar", "abc.jar"]

在容器启动时它给出 "java command not found"。 为什么使用 FROM python3 时安装的 java 会被删除?

首先,回答你为什么安装的 Java 在使用 'FROM python3' 时被删除的问题:

Docker Documentation 状态:

FROM can appear multiple times within a single Dockerfile to create multiple images or use one build stage as a dependency for another...Each FROM instruction clears any state created by previous instructions.

所以发生的事情是你的第二个 'FROM' 正在覆盖第一个 'FROM' 中所做的事情,这就是你在最终图像中看不到 Java 的原因。

现在,要回答隐含的问题,即如何解决这个问题...

由于您希望将所有这些包都放在一个图像中,您需要:

  1. 在单个 'FROM' 部分或
  2. 中添加包
  3. 使用多阶段 docker 构建,将安装、构建等包从一个 'FROM' 指令拉到另一个 'FROM' 指令。如果你想使用多阶段构建,我建议阅读 Docker Documentation on multi-stage builds.

对于此处的示例,选项 (1) 就足够了。对于这种情况,您应该能够执行以下操作:

FROM docker.<xx>.com/alpine-java-python
RUN apk update && apk add python3
......
......
......
......
CMD [ "java", "-jar", "abc.jar"]

请注意,如果 python2 存在于基本映像中,那么现在将安装两个版本,并且您需要在 运行 您的应用程序时引用 python3 版本,或者更改默认版本。