0

我在https://github.com/picklu13/dockerbuildtest有一个项目。当我docker-compose up --buildbuilders目录运行时,生成错误“[错误]您指定的目标需要执行一个项目,但此目录 (/app) 中没有 POM。请验证您从正确的目录调用了 Maven。-> [帮助1]"

现在,如果我注释掉 Dockerfile 的最后一行 # RUN mvn clean package并运行docker-compose up --build,容器就会启动。然后我进入容器docker exec -it <id> bash并运行mvn clean install成功。

我的问题是,为什么第一个构建失败并且没有 pom.xml 错误,尽管它已经存在。

4

2 回答 2

3

在您的第一种情况下,您buildbuilders目录运行,但传递给 Docker 的上下文不包含(它包含根据指令pom.xml在当前目录中的内容)docker-composecontext: .

在您的第二种情况下,up将安装您的项目目录app

 volumes:
      - ~/dockerbuildtest/:/app/

这意味着~/dockerbuildtest/pom.xml它将在容器中显示为/app/pom.xml. mvnapp现在开始运行。

为什么第一个构建失败但没有 pom.xml 错误,尽管它已经存在

存在:在第一次构建中,没有pom.xml复制到您的图像中(请参阅COPY说明)。

您可以通过从项目的根目录运行构建命令并指定 Dockerfile 来确保您的上下文包含pom.xml,例如:

    build:
      # will use current directory as build context
      # by running from your project's root dir, context will contain pom.xml
      context: .
      # path to Dockerfile is relative to where build command is run
      dockerfile: builders/Dockerfile

并将您的复制pom.xml到您的 Dockerfile 中,例如:

# [...]
WORKDIR /app

# copy pom.xml from context into image
COPY pom.xml /app/pom.xml

# run from /app directory which now contains a pom.xml, should work
RUN mvn clean package
于 2020-05-27T06:56:00.073 回答
1

您安装了一个卷,我认为在容器启动时,指定的资源不在所述位置,因为该卷尚未加载。

您可以尝试不使用卷,而是在 dockerfile 中使用 COPY 命令,以确保在容器启动之前资源实际上位于 /app 中。

[编辑] 即使您的场景不允许您这样做,我建议仍然使用 COPY 进行测试,看看这是否确实是一个音量问题。

于 2020-05-27T06:43:54.200 回答