最近想一次性将前端和后端一起打包发布到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文件夹,项目也可以正常运行~~