1. 程式人生 > 其它 >Dockerfile同時配置tomcat和jar包執行

Dockerfile同時配置tomcat和jar包執行

最近想一次性將前端和後端一起打包釋出到docker映象中,這樣在新機器上只需要直接啟動容器就行了。

其中前端是放在tomcat的webapps資料夾下,後端是直接執行java -jar包。

直接用tomcat:8-jdk8-openjdk映象啟動的容器tomcat是已經執行的,只需要把所需的web專案放到webapps資料夾下即可開啟。將jar 包複製進入該容器,然後手動啟動jar包也沒問題,說明容器內已將java繫結環境變數。

所以一開始想的是直接將前後端檔案複製進映象對應位置,然後執行容器時執行java -jar命令即可。然而事與願違,這樣只會執行java命令,而映象原本自啟動tomcat的命令不會執行。

所以第二個思路是執行cmd命令時同時執行啟動tomcat和java命令,然而目前的設定貌似單次只能執行一個命令,我使用&&符號拼接為一個命令並沒有執行成功。

所以有了第三個思路,把cmd執行命令寫為執行檔案.sh,然而又報錯:standard_init_linux.go:228: exec user process caused: exec format error,根據https://blog.51cto.com/u_15127504/4123120  在首行新增#!/bin/bash解決。

最終Dockerfile如下:

from tomcat:8-jdk8-openjdk

# 將要執行的jar包放在了新建的資料夾下 run
mkdir -p /usr/local/tomcat/jar.file
# 把需要修改和新增的檔案複製到對應資料夾 copy Catalina
/localhost/* /usr/local/tomcat/conf/Catalina/localhost/ copy context.xml /usr/local/tomcat/conf/ copy tomcat-users.xml /usr/local/tomcat/conf/ copy test-ui /usr/local/tomcat/webapps/test-ui copy test.jar /usr/local/tomcat/jar.file/ copy run.sh /usr/local/tomcat/run.sh expose 8080 9123 cmd ["/usr/local/tomcat/run.sh"]

要執行的run.sh檔案如下:

#!/bin/bash

nohup java -jar /usr/local/tomcat/jar.file/test.jar --server.port=9123 > /data/logs/test.log 2>&1 &

/usr/local/tomcat/bin/catalina.sh run

其中啟動catalina.sh要放在最後執行,因為它相當於啟動新視窗,放在前面會導致後面的命令無法執行。

最後執行打包後的映象即可:

docker run -dit --name tomcat_jdk_test -p 8080:8080 -p 9123:9123 -e TZ="Asia/Shanghai" -v /etc/localtime:/etc/localtime:ro  -v /data:/data tomcat:8-jdk8-openjdk

如此即可完成。

 

小細節:發現沒有,上面我們不需要複製tomcat容器中webapps.dist資料夾的內容到webapps資料夾,專案也可以正常執行~~