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

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

我是否将战争复制到webapps中:

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 

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

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

我想知道你是如何使用你的图像。 在构build图像时添加20MB文件应该几乎是即时的。 可能会在部署期间以某种方式构build映像,就像AWS在为其提供Dockerfile时一样。

无论如何,我认为这取决于你如何部署。 如果你正在移动自己的图像,我看不到添加一个.war文件和一个爆炸的WAR目录之间的区别。 我会说做什么方便你。 但是,如果您有时从Docker运行应用程序,有时候从.war运行(这可能会错过Docker的一些要点),那么您不妨一直使用.war。

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

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

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

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

你可以做类似的事情,并使用-v选项等来将卷映射到你的应用程序,它是环境设置等。顺便说一句, 这个镜像在Docker Hub上可用。

你实际上应该总是部署爆炸的战争。

速度有两个要素在这里思考:

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

  2. 我的容器的新实例能够多快地开始提供服务请求? (在弹性环境中很重要)

两者的答案是相同的:在创build容器时最好将.war文件分解,而不要将.war文件复制到它。

这具有以下两个非常积极的作用:

  1. 它使得容器版本之间的差异更小,所以你的上传时间更less。
  2. 这意味着,当dynamic扩展以满足应用程序需求时,新的容器实例在开始响应请求之前不必解压.war文件。

对于那些被慢速上传连接所困扰的人来说,使用CI服务器甚至云托pipe的虚拟机来构builddockerhub或dockerhub或其他容器registry是个不错的主意。 这样您就可以利用千兆位级别的上传速度。

这是我如何做到的:

 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目录分隔到自己的容器中。

你可以尝试这样的:使用COPY将war文件复制到容器中使用COPY将jetty runner jar复制到容器中,然后使用CMD像这样运行[“java -jar /path/to/jetty-runner.jar /path/到/ app.war“]

http://www.eclipse.org/jetty/documentation/current/runner.html

注意:您将需要在容器中安装java。