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

Jan*_*ert 24 java jetty maven docker dockerfile

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

我是否将战争复制到webapps:

FROM jetty:9.2.10
MAINTAINER Me "me@me.com"
ADD ./target/*.war /var/lib/jetty/webapps/ROOT.war
Run Code Online (Sandbox Code Playgroud)

或者我采取爆炸的战争档案:

FROM jetty:9.2.10
MAINTAINER Me "me@me.com"
ADD ./target/app-0.1.0.BUILD-SNAPSHOT /var/lib/jetty/webapps/ROOT
Run Code Online (Sandbox Code Playgroud)

通常情况下,如果它是一个普通的容器,就会部署密封的war文件,但是使用docker,这意味着每次进行一次小的更改时都会推送一个10-20MB的文件,而添加爆炸的战争只会推动差异 - .class文件已经改变.

部署爆炸战争而不是战争文件是否有任何缺点?

Rya*_*ber 8

实际上你应该总是部署爆炸的.war.

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

  1. 能够将图像推送到容器存储库的速度有多快?

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

两者的答案是相同的:在创建容器时不要将.war文件复制到其中,而不是将.war文件复制到它.

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

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

对于我们这些因缓慢上传连接而负担的人来说,使用CI服务器甚至是云托管的VM构建并将docker镜像推送到dockerhub或其他容器注册表也是一个好主意.这样您就可以利用千兆级别的上传速度.


Dav*_*ord 7

我是这样做的:

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
Run Code Online (Sandbox Code Playgroud)

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


小智 6

我想知道你是如何使用你的图像的.在构建映像时添加20MB文件应该是即时的.Mayb以某种方式在部署期间构建映像,就像AWS在为其提供Dockerfile时所做的那样.

无论如何,我认为这取决于你的部署方式.如果你在自己周围移动图像,我认为添加.war文件和爆炸的WAR目录之间没有太大的区别.我会说做对你有利的事情.但是,如果您有时从Docker运行应用程序,有时从.war运行(可能会遗漏Docker的某些点),您也可以一直使用.war.

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

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

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

FROM java:8
VOLUME /tmp
VOLUME /app
EXPOSE 8080
ENTRYPOINT ["sh","/app/app.sh"]
Run Code Online (Sandbox Code Playgroud)

您可以执行类似的操作,并使用-v选项等将卷映射到您的应用程序,它的环境设置等.顺便说一句,此图像可在Docker Hub上获得.