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

时间:2015-05-15 05:59:30

标签: java maven jetty 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

或者我采取爆炸的战争文件:

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文件是否有任何缺点?

5 个答案:

答案 0 :(得分:8)

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

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

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

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

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

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

    1. 它使容器版本之间的差异小得多,因此您的上传时间更短。
    2. 这意味着,在动态扩展以满足应用程序需求时,您的新容器实例不必在开始响应请求之前解压缩.war文件。
    3. 对于我们这些因缓慢上传连接而负担的人来说,使用CI服务器甚至是云托管的VM来构建Dockerhub或其他容器注册表并将其推送到dockerhub或其他容器注册表也是一个好主意。这样您就可以利用千兆级别的上传速度。

答案 1 :(得分: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"]

您可以执行类似的操作,并使用-v选项等将卷映射到您的应用,它的环境设置等.BTW,this image可在Docker Hub上使用。

答案 2 :(得分:6)

我就是这样做的:

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

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:1)

如果您像我一样偶然发现这里,寻找如何简单地在容器中部署WAR(使用Apache Tomcat),而不在乎是否有Dockerfile

一个简单,优雅的解决方案。

docker run \
-d \ # Detached mode, swap for -it if we want interactive.
-p 8080:8080  \
-v ${absolute_path_your_project_dir}/${MY_WAR}.war:/usr/local/tomcat/webapps/app.war \
tomcat:latest

然后导航至http://localhost:8080/app/

如果该链接不适合您,请确保将URL中的...8080/app/ 更改为与您在.war中输入的/usr/local/tomcat/webapps/app.war名称相匹配的内容

我还发现,在处理IntelliJ的Docker Plugin时,很容易将其适应Docker插件。只要确保输入完整的路径即可。