首页 > 解决方案 > 使用 Entrypoint 和/或 CMD 作为 docker 文件的一部分运行 mvn 命令

问题描述

我们如何从 Dockerfile 运行 mvn 命令

这是我的 Dockerfile:

FROM maven:3.3.9-jdk-8-alpine
WORKDIR /app
COPY code /app
WORKDIR /app
ENTRYPOINT ["mvn"]
CMD ["clean test -Dsurefire.suiteXmlFiles=/app/abc.xml"]

我试图构建并运行上面的图像,但它失败了( abc.xml 在 /app 目录下)

有没有办法让它工作。

标签: dockermavenjenkinsdockerfile

解决方案


根据文档:“如果 CMD 用于为 ENTRYPOINT 指令提供默认参数,则 CMD 和 ENTRYPOINT 指令都应使用 JSON 数组格式指定。” 因此,您应该按如下方式重写 CMD:

CMD ["clean","test","-Dsurefire.suiteXmlFiles=/app/abc.xml"]

您还可以根据文档将入口点参数化为 JSON 数组:ENTRYPOINT["mvn","clean","test","-Dsurefire.suiteXmlFiles=/app/abc。

但是,我建议您使用带有入口点 ash 文件的最佳实践。这确保更改这些参数不需要重写 dockerfile:

  1. 在代码目录中创建一个 entrypoint.sh 文件。使其可执行。它应该是这样的:

    #!/bin/sh if [ "$#" -ne 1 ] then FILE="abc.xml" else FILE=$1 fi mvn clean test -Dsurefire.suiteXmlFiles="/app/$FILE"

  2. 用 ENTRYPOINT["./entrypoint.sh"] 替换你的入口点

  3. 用 CMD["abc.xml"] 替换你的命令

PS你有两次“WORKDIR /app”。这不是你失败的原因,但它是多余的,你可以摆脱它。


推荐阅读