Maven Docker-对执行和音量的误解

Maven Docker-对执行和音量的误解,maven,docker,Maven,Docker,我的宠物项目中有以下Dockerfile: FROM java:8 ADD target/sources-registry-0.0.1-SNAPSHOT.jar sources-registry.jar RUN bash -c 'touch /sources-registry.jar' ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/sources-registry.jar"] EXPOSE 8761

我的宠物项目中有以下Dockerfile:

FROM java:8
ADD target/sources-registry-0.0.1-SNAPSHOT.jar sources-registry.jar
RUN bash -c 'touch /sources-registry.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/sources-registry.jar"]
EXPOSE 8761
一切都很完美——图像被创建并可以运行。现在介绍一下该项目:它是一个基于maven的项目,在实际执行Dockerfile之前,我必须手动运行mvn包

但是,如果我将Dokerfile更改为,因为我不想手动运行mvn包,而是想将其自动化

FROM java:8
RUN ls target
RUN ./mvnw package
ADD target/sources-registry-0.0.1-SNAPSHOT.jar sources-registry.jar
RUN bash -c 'touch /sources-registry.jar'
#ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/sources-registry.jar"]
EXPOSE 8761
然后在执行时,我得到/bin/sh:1:./mvnw:未找到。但是,mvnw位于pom.xml附近的我的项目文件中

如果我只是按照Dockerfile做的话,情况会更糟

FROM java:8
RUN ls target/
然后我得到ls:cannotaccesstarget/:没有这样的文件或目录

有人能解释一下这种行为吗

我的意思是为什么我可以先用目标文件夹做一些事情 Dockerfile即使不存在第三个Dockerfile? 如何创建项目文件以及将哪些文件复制到项目中 容器 主要问题:为什么第二个Dockerfile不起作用?我怎样才能让它工作?
ADD命令将sources-registry.jar文件复制到Docker映像中,以便第一个示例能够执行它。如果要使用容器中的任何其他文件,还需要使用“添加”或“复制”将它们包含在图像中。有关更多信息,请参见

,因此我基本上需要将所有项目文件复制到容器中,以便能够运行./mvnw包?如果是,最好的方法是什么?我不知道这个Maven命令的要求是什么,但最安全的方法是使用copy。它递归地将所有文件从当前目录第一个点复制到Docker映像第二个点的工作目录。。是Maven包装器,它将下载Maven并运行包生命周期,这意味着下载所有必要的依赖项/插件等,并最终生成您感兴趣的jar文件。我建议在docker容器外构建所需的工件,只将最终的jar文件复制到容器中……除此之外,如果在容器内执行某些操作,则必须在容器内可用,而不是在容器内,因为您需要将文件顶部复制到容器中或将卷装入容器中容器…顺便说一句:我的想法是,你可以在Docker中使用多阶段构建,这在这里会有所帮助。。。