当前位置: 首页 > 知识库问答 >
问题:

在docker映像中部署WAR文件的正确方法

庄文栋
2023-03-14

在docker容器中部署java项目的docker方法是什么?

我是否将战争复制到网络应用程序中:

FROM jetty:9.2.10
MAINTAINER Me "me@me.com"
ADD ./target/*.war /var/lib/jetty/webapps/ROOT.war

还是我拿爆炸的战争文件:

FROM jetty:9.2.10
MAINTAINER Me "me@me.com"
ADD ./target/app-0.1.0.BUILD-SNAPSHOT /var/lib/jetty/webapps/ROOT

通常情况下,如果密封的war文件是一个普通的容器,人们会部署它,但对于docker,这意味着每次做一个小更改时都会推送一个10-20MB的文件,而添加爆炸的war只会推送差异,即。已更改的类文件。

部署爆炸战争而不是战争文件有什么缺点吗?

共有3个答案

古棋
2023-03-14

我想知道你是如何使用你的图像的。在构建图像的同时添加一个20MB的文件几乎应该是即时的。也许你可以在部署期间以某种方式构建映像,就像AWS在给它一个Dockerfile时所做的那样。

无论如何,我认为这取决于你的部署方式。如果你在自己周围移动图像,我看不出添加。war文件和一个分解的war目录。我会说做你方便的事。但是,如果你有时从Docker运行应用程序,有时从。战争(这可能会错过Docker的一些要点),您不妨使用。战争无时无刻不在发生。

如果你要部署到像AWS弹性豆茎(从存储库中提取图像的东西)这样的东西,它想要一个Dockerfile或一个Dockerrun.aws.json文件,那么将图像与你实际部署的东西分开是有意义的(或者到目前为止对我来说是有意义的)。这允许容器保持不变,而更新你的应用程序可能只是将一个. jar/. war文件复制到正确的位置(这也可能错过了Docker的部分意义;)。

我一直在做的是在Docker Hub上创建一个基本映像,然后使用Dockerrun.aws.json文件在我的应用程序中映射。这样,AWS就不需要构建我的映像,只需拉动它。这要快得多,成本也更低(美元)。但它确实将我的应用程序与映像分开了,这在某些情况下可能会使部署复杂化。然而,因为我的映像非常稳定,我通常只需将一个. jar文件、一个Dockerrun.aws.json文件和一个外壳脚本捆绑到一个. zip中,然后上传到AWS。我认为这很容易。

我的Dockerfile非常简单,我的Spring Boot应用程序只需要它:

FROM java:8
VOLUME /tmp
VOLUME /app
EXPOSE 8080
ENTRYPOINT ["sh","/app/app.sh"]

您可以做类似的事情,并使用-v选项等。,将卷映射到您的应用程序,它的环境设置等。

齐飞星
2023-03-14

我就是这样做的:

FROM tomcat:8.0
MAINTAINER David Ford <dford@smart-soft.com>
ENV DB_HOST mySqlServer
ENV DB_USER joeBlow
ENV DB_PASSWORD bla bla bla
EXPOSE 8080
RUN rm -fr /usr/local/tomcat/webapps/ROOT
COPY target/webapp /usr/local/tomcat/webapps/ROOT

在我的待办事项列表中:将WEB_INF/lib dir分离到自己的容器中。

陆才俊
2023-03-14

实际上,您应该始终部署爆炸的. war。

这里需要考虑速度的两个要素:

>

  • 将映像上推到容器存储库的速度有多快?

    容器的新实例可以多快开始服务请求?(在弹性缩放环境中很重要)

    对这两个问题的答案都是一样的:你最好是引爆炸弹。创建容器而不复制。战争档案。

    这有以下两个非常积极的影响:

    1. 它使容器版本之间的差异更小,因此您的上传时间更短
    2. 这意味着,当动态扩展以满足应用程序需求时,您的新容器实例不必解压缩。war文件,然后他们才能开始响应请求

    对于那些被缓慢上传连接拖累的人来说,使用CI服务器甚至云主机构建docker映像并将其推送到dockerhub或其他容器注册表也是一个好主意。这样你就可以利用千兆规模的上传速度。

  •  类似资料:
    • 问题内容: 在Docker容器中部署Java项目的Docker方法是什么? 我是否会将战争复制到webapps中: 还是我拿爆炸的战争文件: 通常,如果它是一个普通的容器,则将部署密封的war文件,但是对于docker,这意味着每次您进行较小的更改时都会推送10-20MB的文件,而添加展开的war只会推动差异-.class文件已经改变。 部署爆炸式战争而不是战争档案有不利之处吗? 问题答案: 我想

    • 我会告诉你我所做的所有步骤。我还会给出一些图片,使我的问题更容易理解。任何推荐都会很好。 有必要说我用 Tomcat 6(安装在C:\Program Files\Apache Software Foundation\Tomcat 6.0) 1)创建一个新的Web应用程序项目(GWT)。它在Jetty上运行良好 3)第一个问题(我认为也是最主要的问题):WAR文件没有转到C:\Program Fil

    • 5.使用cmd重新启动tomcat。 “信息:部署web应用程序目录C:\apache-tomcat-7.0.77\webapps\MyProject Jun 07,2017 4:50:19 PM org.apache.catalina.startup.hostconfig deployDirectory信息:web应用程序目录C:\apache-tomcat-7.0.77\webapps\MyP

    • 我是部署新手,我已经将jar文件作为一个包,我应该如何在prod服务器中进行部署? 我的prod服务器基本上是运行在AWS上的EC2机器 我应该运行java-jar“jar文件”吗?这是prod服务器的实践方式吗? 我应该将. jar文件打包到ears/war并部署在tomcat/jboss服务器中吗? 感谢您的帮助!

    • 我试图创建一个jboss/wildfly的映像,可以用于war部署,下面是我用于创建映像的docker文件。 但是,当我使用“docker run-p9990:9990 hello”命令运行容器时,jboss服务器正在启动,但部署文件夹中的war文件没有部署。 docker文件 添加独立的完整poc。xml/opt/jboss/wildfly/standalone/configuration/ 添

    • 当我尝试在jboss server 7.0中部署war文件时,它显示以下错误。请告知。 异常日志: