Docker - 对执行和数量的误解

时间:2017-04-29 18:39:45

标签: 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

一切都完美无缺 - 图像被创建并可以运行。现在对项目进行一些描述:它是一个基于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. 如何将项目文件(以及哪些文件)复制到已创建的文件中 容器
  3. 主要问题:为什么第二个Dockerfile无效?我怎么能让它发挥作用?

1 个答案:

答案 0 :(得分:1)

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