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 

而且一切都很完美 – 图像被创build并可以运行。 现在介绍一下这个项目:这是一个基于maven的项目,在实际执行Dockerfile之前,我必须手动运行mvn package

但是,如果我将Dokerfile更改为(因为我不想手动运行mvn package并想自动运行它)

 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: not found 。 但是, mvnw在我的项目文件附近的pom.xml

更多,如果我只是跟随Dockerfile

 FROM java:8 RUN ls target/ 

那么我得到ls: cannot access target/: No such file or directory

有人可以解释这种行为吗?

  1. 我的意思是为什么我实际上可以做一些目标文件夹(第一个Dockerfile),即使不存在(第三个Dockerfile)?
  2. 如何将项目文件(以及哪些文件)复制到创build的容器中?
  3. 主要问题:为什么第二个Dockerfile不工作? 我怎样才能使它工作?

ADD命令将sources-registry.jar文件复制到Docker镜像中,以便第一个示例能够执行它。 如果您想使用容器内的任何其他文件,则还需要将它们包含在图像中(使用ADD或COPY)。 有关更多信息,请参阅参考文档