2016-06-07 201 views
1

我正在嘗試將.war,.aar,.xml和.properties文件部署到tomcat docker容器。我在Dockerfile下面使用了基礎tomcat docker鏡像。在tomcat docker容器中部署Java應用程序

FROM tomcat:7 
RUN rm -rf /usr/local/tomcat/webapps/ROOT 
COPY test-3.0.war /usr/local/tomcat/webapps/ROOT.war 
COPY testone-3.0.aar /usr/local/tomcat/webapps/axis2/WEB-INF/services/ 
COPY ./conf/context.xml /usr/local/tomcat/conf/ 
COPY ./conf/server.xml /usr/local/tomcat/conf/ 
CMD ["catalina.sh", "run"] 

一切按預期工作到現在爲止。它提取戰爭文件並啓動容器內的應用程序。

但是現在我需要添加/編輯「/ usr/local/tomcat/webapps/ROOT/WEB-INF/classes /」和「/ usr/local/tomcat/webapps/ROOT/js「喜歡這個。

COPY ./conf/applicationurl.properties /usr/local/tomcat/webapps/ROOT/WEBINF/classes/ 
COPY ./conf/memcache.properties /usr/local/tomcat/webapps/ROOT/WEB-INF/classes/ 
COPY ./conf/um.properties /usr/local/tomcat/webapps/ROOT/WEB-INF/classes/ 
COPY ./conf/pe.properties /usr/local/tomcat/webapps/ROOT/WEB-INF/classes/ 
COPY ./conf/check.js /usr/local/tomcat/webapps/ROOT/js 

將這些文件複製到正在運行的tomcat容器中的最佳方法是什麼?我試圖用上面的Dockerfile作爲基礎鏡像構建一個更多的Docker鏡像,並將上述文件複製到容器內的目標文件夾中,但它會刪除所有提取的war文件夾/文件,並且它只複製/ usr/local/tomcat中的文件/ webapps目錄。

我只需要添加一些屬性文件,它不應該刪除webapps目錄內現有的解壓縮文件夾。

有人可以幫我解決這個問題嗎?

+0

更編程方法是來準備你的java應用程序,所以你可以用-D標誌或類似的東西指向配置所在的位置。然後,您可以在複製war文件後將-D標誌附加到CATALINA_OPTS變量 –

+0

另一種方法是在啓動服務器之前將屬性構建到jar中並將其部署到tomcat/lib。 –

+0

感謝您的建議。但我需要通過在docker中使用上述場景來完成此操作。 – Nanab4u

回答

0

可以通過使用可以使用nohup調用的後腳本然後調用tomcat運行來解決。

postscript.sh有post操作 - 將複製命令列表移動到postscript.sh在複製命令之前,在腳本中包含一些等待邏輯,直到tomcat啓動。 (它可以只是睡了幾秒鐘,甚至用grep tomcat的日誌,搜索服務器啓動)

#postscript.sh 
    sleep 1000 
    copy commands 

創建使用nohup的調用後腳本啓動腳本,然後調用Tomcat的運行

#start.sh 
nohup postscript.sh & catalina.sh run 

然後更改CMD以在dockerfile中運行start.sh。還要將postscript.sh和start.sh文件複製到容器中的某個位置(例如/ tmp)。

#....other contents 
    COPY start.sh /tmp/start.sh 
    COPY postscript.sh /tmp/postscript.sh 
    CMD ["/tmp/start.sh"] 

希望這有助於。

+0

Thanks.But我試圖運行該圖像時出現以下錯誤。 「docker:來自守護進程的錯誤響應:容器命令'/tmp/start.sh'不能調用」 「。 你有什麼想法嗎? – Nanab4u

+0

檢查start.sh是否被複制到/ tmp文件夾。您可以通過在容器上運行bash來檢查/ tmp的內容。 – sandy

+0

構建圖像時,它正在複製到特定位置。但是,當使用docker run啓動容器時,容器本身不會啓動並拋出前面提到的錯誤。因此無法向它發起衝擊。 – Nanab4u

1

另一種選擇是僅僅解壓縮war文件(您可以重命名爲zip,因爲它確實是zip文件)。

所以:

  1. 解壓戰爭
  2. 做出必要的子文件夾中的所有修改。
  3. 重新拉鍊
  4. 重命名到.WAR
  5. 部署按正常

我經由DockerFile腳本操縱war。就我而言,它的Geoserver部署+添加插件jars/WEB-INF/lib

總之

,解壓後是這樣的: unzip geoserver-2.10.2.war -d geoserver_war/

希望幫助別人