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

我正在尝试执行“mvn install”从Dockerfile创buildwar文件。 贝娄是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环境variables中添加了maven的bin目录的path。

PATH =在/ usr / local / sbin中:在/ usr / local / bin目录:/ usr / sbin目录:在/ usr / bin中:/ sbin目录:/ bin中:在/ usr /游戏:在/ usr /本地/游戏:/首页/ VENI /文档/apache-maven-3.3.9/bin/

我在我的机器上从根用户设置的path,我也添加了相同的pathPATHvariables作为正常的用户已经。

所以,现在我退出root用户,sudo su回来作为root用户,并检查PATHvariables,它没有maven的path

所以当我做dockerbuild立的形象我得到了以下错误

/ bin / sh:1:mvn:not found命令'/ bin / sh -c mvn install'返回一个非零的代码:127

鉴于您想要在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的)

要build立它,执行:

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

你可以使用你想要的东西。

在标准的Tomcat 8镜像下载时,第一次需要花费一些时间。

现在你可以运行它了:

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

您并不是真的想在Docker镜像中构buildWAR文件。 这将吸收maven使用的所有maven资源库组件,将您的应用程序构build到映像中。 这个空间是不可收回的,因为图像只会增长 – 他们再也不会缩水。

你有没有考虑过使用一个maven:onbuild形象与多阶段构build呢?

这种用法的示例(使用Spring Boot应用程序)可以在这里find: https : //github.com/anokun7/docker-springframework/blob/master/Dockerfile

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

您应该首先在您的容器中安装它(使用一个RUN apt-get install.. )然后您将能够在下一个RUN