2015-06-10 52 views
4

我正在使用docker部署一个运行第三方的tomcat容器war文件。Docker tomcat编辑展开的war文件

Dockerfile看起来像这样

FROM tomcat:7-jre8 

ADD my.war ${CATALINA_HOME}/webapps/my.war 

当我运行容器Tomcat将展开我的war在运行时,我可以高兴地在http://my.ip.addr:8080/mywar/访问我的应用程序。

但是,我的问题是,我想编辑war内的几个配置文件。我真的不想打开包装并重新包装war文件,因为这看起来很脏,很难维护。

我希望能够告诉tomcat的扩大war为我RUN步骤的一部分,然后用ADD把我的自定义文件,但我似乎无法找到这样做的方式。在执行CMD时战争只会扩展,然后我无法编辑文件。

+0

用'搬运工EXEC -IT CONTAINER_ID bash'看到该文档https://docs.docker.com/reference/commandline/cli/#exec连接,然后修改文件,然后'exit'离开容器,然后在需要时使用'docker commit'提交您的修改请参阅http://docs.docker.com/reference/commandline/cli/#commit – user2915097

+0

这似乎并不理想,因为我每次都必须执行这些手动步骤更新图像。 –

回答

0

您可以使用运行命令启动tomcat容器,然后立即停止它。这将导致战争扩大,然后你可以继续并修改配置文件。

例:

RUN Start_tomcat.sh && \ 
    stop_tomcat.sh && \ 
    edit_1_config_file.sh && \ 
    edit_2_config_file.sh 

注意:你需要做一次运行命令的所有步骤。由于Docker构建将采用每个命令并将其运行在从前一个命令生成的映像上并提交。并且服务中断取决于在先前的运行命令中启动的服务将不起作用。

+0

我确实尝试过,但是启动tomcat脚本(在我的例子中是'catalina.sh start')只是永远运行,并且永远不会运行停止脚本。 –

+0

你是如何安装tomcat的?如果你通过软件包管理器安装它,你应该有一个/etc/init.d/tomcat start或者service tomcat start,它应该在后台启动它。另外请看这个https://www.liferay.com /web/brett.swaim/blog/-/blogs/sample-tomcat-startup-scripts,看起来你可以调用$ TOMCAT_HOME/bin/startup.sh来启动tomcat。 –

+0

我使用官方码头tomcat7图像。 –

3

我不确定你将如何用docker或其他东西来实现它,因为我没有看到反正问tomcat在实际启动之前扩展战争。但按照标准做法,爆发战争并调整内容并不是一个好主意。它杀死了打仗的全部目的。

相反,您应该更改应用程序以从< < TOMCAT_HOME >>/conf中读取配置。

如果你做到这一点,你需要告诉Docker的唯一的事情就是把你的配置文件添加到容器的tomcat conf文件夹。

或者如果您必须篡改战争文件,您可以这样做: 在您的构建机器上手动(或通过脚本)分解战争,而不是直接将战争添加到泊坞窗图像,地图文件夹。 类似这样的东西

ADD ./target/app-0.1.0.BUILD-SNAPSHOT/var/lib/jetty/webapps/ROOT。

然后手动将所有文件添加到所需的目标。

添加login.jsp/var/lib/jetty/webapps/ROOT/Webapps,等等。

+0

是的,我同意但是应用程序由第三方打包,并且不希望每次发布都更新它。 –

+1

如果是这种情况,您可以采取的另一种方法是在构建机器上手动分解战争,而不是直接将战争添加到泊坞窗图像,则映射该文件夹。像这样ADD ./target/app-0.1.0.BUILD-SNAPSHOT/var/lib/jetty/webapps/ROOT。并分别将您的配置添加到图像。 –

+0

它看起来像有些东西放在'content'和'webapps'中。我该怎么做? –

0

只需添加一个RUN指令,启动服务器在后台,给它几秒钟,然后退出即

RUN bash -c "catalina.sh start; sleep 5; catalina.sh stop;" 

你需要给它足够长的时间,以扩大战争的文件。

+0

我试过这个,'catalina.sh start'命令只是挂起而不会退出。 –

+0

这是一个不同的问题 - catalina.sh应该开始分叉。我测试过这个。 –

+0

你确定你不会迷惑catalina.sh run和catalina.sh start吗? –

1

如何在启动tomcat之前手动解压缩战争?

ADD my.war /tmp/my.war 
RUN unzip /tmp/my.war -d /usr/local/tomcat/webapps/mywar 

# Edit config files 

# Now you can start tomcat... 
CMD ["catalina.sh", "run"] 
+0

似乎有一些内容是在'webapps'目录之外提取的,例如'content'。我不知道如何将其提取到正确的位置。 –

+0

嗯......这个Tomcat 7有关吗? (我在Tomcat 8上找不到“内容”目录)。你试过我的方法是否有效?或者:如果您手动解压缩,哪些部分丢失? – netzwerg

+0

您的方法可行,但应用程序无法找到它的配置(它希望在'content'中找到它)。当手动解压缩时,我可以找到以'content'结尾的配置文件,但我不知道他们如何知道去哪里。 –