在 docker 映像中部署 WAR 文件的正确方法
Correct way to deploy WAR files in docker image
在 docker 容器中部署 java 项目的 docker 方法是什么?
我是否将 war 复制到 webapps:
FROM jetty:9.2.10
MAINTAINER Me "me@me.com"
ADD ./target/*.war /var/lib/jetty/webapps/ROOT.war
还是我要分解的 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,这意味着每次您在添加exploded war 只会推动差异 - 已更改的 .class 文件。
部署展开的 war 而不是 war 文件有什么缺点吗?
你可以试试这个:
使用 COPY 将 war 文件复制到容器中
使用 COPY 将 jetty 运行ner jar 复制到容器中
然后像这样使用 CMD 运行 ["java -jar /path/to/jetty-runner.jar /path/to/app.war"]
http://www.eclipse.org/jetty/documentation/current/runner.html
注意:您需要在容器中安装 java。
我想知道您是如何使用图像的。在构建图像时添加一个 20MB 的文件应该几乎是即时的。也许你在部署期间以某种方式构建图像,就像 AWS 在你给它一个 Docker 文件时所做的那样。
无论如何,我认为这取决于您的部署方式。如果您在自己周围移动图像,我看不到添加 .war 文件和展开的 WAR 目录之间有太大区别。我会说做你方便的事。但是,如果您有时 运行 来自 Docker 的应用程序,有时来自 .war (这可能会遗漏 Docker 的某些要点),您不妨使用.war一直。
如果您要部署到 AWS Elastic Beanstalk(从存储库中提取图像的东西),它需要 Docker 文件或 Dockerrun.aws.json 文件,然后分离图像从你实际部署的内容来看是有道理的(或者到目前为止对我来说是有意义的)。这允许容器保持不变,而更新您的应用程序只需将 .jar/.war 文件复制到正确的位置(这也可能会遗漏 Docker ; 的部分要点)。
我一直在做的是在 Docker Hub 上创建一个基本图像,然后使用 Dockerrun.aws.json 文件映射到我的应用程序中。这样,AWS 就不需要构建我的镜像,只需拉取它即可。这样速度更快,成本更低($)。但它确实将我的应用程序与图像分开,这在某些情况下可能会使部署复杂化。但是,因为我的图像太稳定了,所以我一般只是将一个.jar 文件、一个Dockerrun.aws.json 文件和一个shell 脚本打包成一个.zip,然后上传到AWS。我觉得很简单。
我的 Docker 文件非常简单,我的 Spring 启动应用程序真的只需要这些文件:
FROM java:8
VOLUME /tmp
VOLUME /app
EXPOSE 8080
ENTRYPOINT ["sh","/app/app.sh"]
您可以做类似的事情并使用 -v 选项等将卷映射到您的应用程序、它的环境设置等。顺便说一句,this image 在 Docker Hub 上可用。
你实际上应该总是部署爆炸的。war。
这里有两个速度要素需要考虑:
将镜像推送到容器存储库的速度有多快?
和
我的容器的新实例多快可以开始处理请求? (在弹性缩放环境中很重要)
两者的答案是相同的:您最好在创建容器时分解 .war 文件,而不是将 .war 文件复制到其中。
这有以下两个非常积极的影响:
- 它使容器版本之间的差异更小,因此您的上传时间更少。
- 这意味着,当动态扩展以满足应用程序需求时,您的新容器实例无需解压缩您的 .war 文件即可开始响应请求。
对于我们这些被慢速上传连接所困扰的人来说,使用 CI 服务器甚至云托管 VM 来构建和推送您的 docker 图像也是一个好主意 docker集线器或其他容器注册表。这样您就可以利用千兆级上传速度。
我是这样做的:
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 目录分离到它自己的容器中。
如果你像我一样偶然发现这里,寻找如何简单地将 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/。
如果 link 对您不起作用,请务必将 URL 中的 ...8080/app/
更改为与 .war
你在 /usr/local/tomcat/webapps/app.war
.
中输入的名字
我还发现,在使用 IntelliJ 的 Docker Plugin 时,很容易将其适应 Docker 插件。请务必输入完整路径。
在 docker 容器中部署 java 项目的 docker 方法是什么?
我是否将 war 复制到 webapps:
FROM jetty:9.2.10
MAINTAINER Me "me@me.com"
ADD ./target/*.war /var/lib/jetty/webapps/ROOT.war
还是我要分解的 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,这意味着每次您在添加exploded war 只会推动差异 - 已更改的 .class 文件。
部署展开的 war 而不是 war 文件有什么缺点吗?
你可以试试这个: 使用 COPY 将 war 文件复制到容器中 使用 COPY 将 jetty 运行ner jar 复制到容器中 然后像这样使用 CMD 运行 ["java -jar /path/to/jetty-runner.jar /path/to/app.war"]
http://www.eclipse.org/jetty/documentation/current/runner.html
注意:您需要在容器中安装 java。
我想知道您是如何使用图像的。在构建图像时添加一个 20MB 的文件应该几乎是即时的。也许你在部署期间以某种方式构建图像,就像 AWS 在你给它一个 Docker 文件时所做的那样。
无论如何,我认为这取决于您的部署方式。如果您在自己周围移动图像,我看不到添加 .war 文件和展开的 WAR 目录之间有太大区别。我会说做你方便的事。但是,如果您有时 运行 来自 Docker 的应用程序,有时来自 .war (这可能会遗漏 Docker 的某些要点),您不妨使用.war一直。
如果您要部署到 AWS Elastic Beanstalk(从存储库中提取图像的东西),它需要 Docker 文件或 Dockerrun.aws.json 文件,然后分离图像从你实际部署的内容来看是有道理的(或者到目前为止对我来说是有意义的)。这允许容器保持不变,而更新您的应用程序只需将 .jar/.war 文件复制到正确的位置(这也可能会遗漏 Docker ; 的部分要点)。
我一直在做的是在 Docker Hub 上创建一个基本图像,然后使用 Dockerrun.aws.json 文件映射到我的应用程序中。这样,AWS 就不需要构建我的镜像,只需拉取它即可。这样速度更快,成本更低($)。但它确实将我的应用程序与图像分开,这在某些情况下可能会使部署复杂化。但是,因为我的图像太稳定了,所以我一般只是将一个.jar 文件、一个Dockerrun.aws.json 文件和一个shell 脚本打包成一个.zip,然后上传到AWS。我觉得很简单。
我的 Docker 文件非常简单,我的 Spring 启动应用程序真的只需要这些文件:
FROM java:8
VOLUME /tmp
VOLUME /app
EXPOSE 8080
ENTRYPOINT ["sh","/app/app.sh"]
您可以做类似的事情并使用 -v 选项等将卷映射到您的应用程序、它的环境设置等。顺便说一句,this image 在 Docker Hub 上可用。
你实际上应该总是部署爆炸的。war。
这里有两个速度要素需要考虑:
将镜像推送到容器存储库的速度有多快?
和
我的容器的新实例多快可以开始处理请求? (在弹性缩放环境中很重要)
两者的答案是相同的:您最好在创建容器时分解 .war 文件,而不是将 .war 文件复制到其中。
这有以下两个非常积极的影响:
- 它使容器版本之间的差异更小,因此您的上传时间更少。
- 这意味着,当动态扩展以满足应用程序需求时,您的新容器实例无需解压缩您的 .war 文件即可开始响应请求。
对于我们这些被慢速上传连接所困扰的人来说,使用 CI 服务器甚至云托管 VM 来构建和推送您的 docker 图像也是一个好主意 docker集线器或其他容器注册表。这样您就可以利用千兆级上传速度。
我是这样做的:
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 目录分离到它自己的容器中。
如果你像我一样偶然发现这里,寻找如何简单地将 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/。
如果 link 对您不起作用,请务必将 URL 中的 ...8080/app/
更改为与 .war
你在 /usr/local/tomcat/webapps/app.war
.
我还发现,在使用 IntelliJ 的 Docker Plugin 时,很容易将其适应 Docker 插件。请务必输入完整路径。