【问题标题】:Run mvn commands as part of the docker file using Entrypoint and/or CMD使用 Entrypoint 和/或 CMD 作为 docker 文件的一部分运行 mvn 命令
【发布时间】:2021-05-03 14:32:24
【问题描述】:

我们如何从 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 目录下)

有没有办法让它工作。

【问题讨论】:

  • 你应该在入口点内使用'mvn'命令
  • 您可能希望 RUN mvn ... 作为映像构建序列的一部分,而不是作为主容器命令。设置CMD java -jar ... 来运行构建的应用程序,根本不要设置ENTRYPOINT。如果您使用任何这些命令的 JSON 数组形式,则需要将其分解为每个数组元素的单独单词。
  • 主要目标是能够克隆一个 repo(在这种情况下通过 COPY 命令,因为我在本地拥有 repo)并运行 mvn clean 测试 - 通过 ENTRYPOINT 或/和 CMD。并且不使用 RUN 命令。
  • 当我使用 - ENTRYPOINT ["mvn clean test -Dsurefire.suiteXmlFiles=/app/abc.xml"] 时,我得到一个没有这样的文件或目录的错误。

标签: docker maven jenkins dockerfile


【解决方案1】:

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

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

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

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

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

    #!/bin/sh 如果 [ "$#" -ne 1 ] 然后 文件="abc.xml" 别的 文件=$1 菲 mvn clean test -Dsurefire.suiteXmlFiles="/app/$FILE"

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 2021-03-13
    • 2017-12-20
    • 2017-05-13
    • 2019-05-02
    • 1970-01-01
    • 2013-06-30
    相关资源
    最近更新 更多