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

2022-09-01 12:08:13

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

我是否将战争复制到 Web 应用程序中:

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已更改的文件。

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


答案 1

您实际上应该始终部署爆炸的 .war。

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

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

  2. 我的容器的新实例可以多快开始处理请求?(在弹性扩展环境中很重要)

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

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

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

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


答案 2

我是这样做的:

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


推荐