在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只会推动差异-.class文件已经改变。
部署爆炸式战争而不是战争档案有不利之处吗?
我想知道您如何使用图片。在构建映像时添加20MB文件几乎是即时的。可以让您以某种方式在部署期间构建映像,就像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选项等将卷映射到您的应用程序,环境设置等。顺便说一下,此映像在Docker Hub上可用。