我正在尝试执行" 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的路径
/ bin / sh:1:mvn:未找到 命令' / bin / sh -c mvn install'返回非零代码:127
答案 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