【问题标题】:I am trying to perform mvn install from Dockerfile but it is not working says mvn not found我正在尝试从 Dockerfile 执行 mvn install 但它不起作用说 mvn not found
【发布时间】:2017-11-19 06:26:10
【问题描述】:

我正在尝试执行“mvn install”以从 Dockerfile 创建战争文件。下面是 Dockerfile

FROM scratch
FROM ubuntu:16.04

RUN mkdir /opt/java8
RUN mkdir /opt/tomcat8
RUN mkdir /opt/maven3

ENV JAVA_HOME /opt/java8
ENV CATALINA_HOME /opt/tomcat8

ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin:$M2_HOME/bin

ADD jdk1.8.0_112 /opt/java8
ADD apache-tomcat-8.0.38 /opt/tomcat8

WORKDIR /home/veni/git/M_UserTP
RUN mvn install

WORKDIR /home/veni/git/M_UserTP/target 
RUN mv M_UserTP.war 
/home/veni/Documents/dhaval_bhoot/docker_images/tomcat1

ADD M_UserTP.war /opt/tomcat8/webapps

EXPOSE 8080

CMD ["catalina.sh", "run"]

我还在PATH环境变量中添加了maven的bin目录的路径。

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/ veni/Documents/apache-maven-3.3.9/bin/

我在我的机器上从 root 用户设置的这个路径,我还在 PATH 变量中添加了与普通用户相同的路径。

所以现在我退出 root 用户并通过 sudo su 返回为 root 用户并检查 PATH 变量,它没有 maven 的路径

所以当我做 docker build of image 我得到波纹管错误

/bin/sh: 1: mvn: 未找到 命令“/bin/sh -c mvn install”返回非零代码:127

【问题讨论】:

    标签: maven docker build


    【解决方案1】:

    假设您想在 Tomcat 8 Docker 容器中运行您的应用程序:

    你的 maven 项目应该这样布局:

    M_UserTP
    + Dockerfile
    + pom.xml
    + 源
    + 目标

    这是一个标准的 maven 布局加上你的 Dockerfile。

    确保您的 pom.xml 包含在其中定义的以下 finalName

    <build>
        <finalName>${project.artifactId}</finalName>
        ...
    </build>
    

    您的 Dockerfile 可以非常简单:

    FROM tomcat:8.0    
    COPY target/M_UserTP.war $CATALINA_HOME/webapps/
    

    (注意 Dockerfile 如何使用 finalName)

    要构建它,请执行:

    mvn clean install && docker build . -t Bhoot/M_UserTP
    

    你可以使用任何你想要的-t标签。

    在下载标准 Tomcat 8 映像时,第一次执行此操作需要一些时间。

    现在你可以运行它了:

    docker run --detach --publish 8080:8080 Bhoot/M_UserTP
    

    您并不想在 docker 映像中构建您的 WAR 文件。这将吸收 maven 用于将应用程序构建到映像中的所有 maven 存储库组件。这个空间是不可恢复的,因为图像只会增长——它们永远不会再缩小。

    【讨论】:

      【解决方案2】:

      您是否考虑过将maven:onbuild 图像与多阶段构建结合使用?

      此处提供了此类用法的示例(使用 Spring Boot 应用程序):https://github.com/anokun7/docker-springframework/blob/master/Dockerfile

      【讨论】:

        【解决方案3】:

        您的容器有自己的文件系统。 因此,您系统上可用的 mvn 二进制文件在基本 ubuntu 映像上不可用。

        您应该首先将它安装在您的容器中(使用RUN apt-get install..) 然后你就可以在下一次 RUN 中使用它了

        【讨论】:

        • 我在 docker 文件中添加了“ADD apache-maven-3.3.9 /opt/maven3”来添加 maven,并且 maven bin 目录的路径在我的 docker 文件第 11 行的路径变量中,但仍然出现同样的错误
        • 您可以尝试使用 mvn 的完整路径吗? /opt/maven3/mvn 安装?
        【解决方案4】:

        尝试进入你的容器(在注释掉 maven 层和下面的所有内容之后)并输入which mvn。这将显示 maven 二进制文件的绝对路径。然后在 Dockerfile 中使用该绝对路径,而不仅仅是 mvn

        示例: mvn -> /opt/maven/bin/mvn

        【讨论】:

          猜你喜欢
          • 2022-06-11
          • 2021-04-23
          • 1970-01-01
          • 2020-06-08
          • 2011-06-10
          • 2017-11-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多