Dockerfile同時配置tomcat和jar包執行
阿新 • • 發佈:2022-04-01
最近想一次性將前端和後端一起打包釋出到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包放在了新建的資料夾下 runmkdir -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資料夾,專案也可以正常執行~~