一尘不染

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

docker

在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文件已经改变。

部署爆炸式战争而不是战争档案有不利之处吗?


阅读 935

收藏
2020-06-17

共1个答案

一尘不染

我想知道您如何使用图片。在构建映像时添加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上可用。

2020-06-17