我试图从Dockerfile执行mvn安装,但它没有工作说mvn没有找到

时间:2017-06-16 12:59:39

标签: maven docker build

我正在尝试执行" mvn install"从Dockerfile创建war文件。 Bellow是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 /游戏:在/ usr /本地/游戏:/家庭/ VENI /文档/ Apache的行家-3.3.9 / bin中/

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

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

所以当我制作图片的docker构建时,我得到了下面的错误

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

4 个答案:

答案 0 :(得分:1)

鉴于您希望在Tomcat 8 Docker容器中运行应用程序:

你的maven项目应该像:

  

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

这是标准的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存储库组件,以将您的应用程序构建到映像中。这个空间是不可恢复的,因为图像只会增长 - 它们永远不会再缩小。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

您应该先在容器中安装它(使用RUN apt-get install..) 然后,您就可以在下一次运行中使用它

答案 3 :(得分:0)

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

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