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

在docker文件中使用2:alpine java python和python3删除已安装的java?,java,python-3.x,docker,alpine,Java,Python 3.x,Docker,Alpine,在我的项目中,我需要java和python3。 我在Dockerfile中使用了2个FROM语句 FROM docker.<xx>.com/alpine-java-python ...... ...... FROM python3 ...... ...... CMD [ "java", "-jar", "abc.jar"] 来自docker..com/alpine java python的 ...... ...... 从蟒蛇3 ...... ...... CMD[“java”、“-

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

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

......
......
从蟒蛇3
......
......
CMD[“java”、“-jar”、“abc.jar”]
在容器启动时,它给出“未找到java命令”。
为什么在使用FROM python3时会删除已安装的java?

首先,要回答为什么在使用“FROM python3”时会删除已安装的java的问题:

各国:

FROM可以在单个Dockerfile中多次出现,以创建多个映像,或将一个构建阶段用作另一个构建阶段的依赖项……每条FROM指令都会清除以前的指令创建的任何状态

所以现在发生的事情是,您的第二个“FROM”写在第一个“FROM”中所做的事情之上,这就是为什么您在最后的图像中看不到Java

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

由于您希望在单个映像中包含所有这些包,因此您需要:

  • 将包添加到单个“发件人”部分或
  • 使用多级docker构建,将安装、构建的包等从一条“from”指令拉入另一条“from”指令。如果您想使用多阶段构建,我建议您阅读
  • 对于这里的示例,选项(1)就足够了。在这种情况下,您应该能够执行以下操作:

    FROM docker.<xx>.com/alpine-java-python
    RUN apk update && apk add python3
    ......
    ......
    ......
    ......
    CMD [ "java", "-jar", "abc.jar"]
    
    来自docker..com/alpine java python的
    
    运行apk更新和apk添加python3
    ......
    ......
    ......
    ......
    CMD[“java”、“-jar”、“abc.jar”]
    

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