docker启动jar包输出日志的问题以及解决
作者:vi__ky
docker启动jar包输出日志的问题
由于公司使用docker, 传统的docker都是在dockerfile中使用CMD或者ENTRYPOINT指定启动jar包命令,
如下:
ENTRYPOINT ["nohup","java","-jar","-Xms1G","-Xmx2G","-Dspring.profiles.active=prod","/xings/datamanagement.jar"]
然后查看docker logs来获取启动日志, 但是这样好像不太方便查询和保存历史日志. 于是我想启动的时候就指定日志输出,
类似下面这样:
ENTRYPOINT ["nohup","java","-jar","-Xms1G","-Xmx2G","-Dspring.profiles.active=prod","/xings/datamanagement.jar",">> ","/projects/datas.log","&"]
不过发现并不生效.
思路与解决方式
首先进入到容器当中去手动启动,发现可以输出日志,
其次将日志目录- v映射出来就可以在外面实时查看日志了
但是还有一个问题就是我不可能每次都进入容器里边启动项目,但是如果写到dockerfile中去启动即死板(后期改动jar包都需要重新build)而且不能输出程序log日志,于是打算将镜像抽取出来,公用,然后单写shell去启动docker.
想到就开始做:
原dockerfile文件:
FROM java:8 MAINTAINER xs COPY data-manager-agent-0.0.1-SNAPSHOT.jar /xings/datamanagement.jar RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone ENTRYPOINT ["nohup","java","-jar","-Xms1G","-Xmx2G","-Dspring.profiles.active=prod","/xings/datamanagement.jar"] ``` 将员原来死板的docker改为: ```c FROM java:8 MAINTAINER xs RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
其中run的内容是将容器时间和本地服务器时间一致, 并且该dockerfile只构建基础镜像,切只有一个java8, 所有只用到java8的项目都可以使用此镜像,相对原来每次改动代码都需要重新传jar包去重新build dockerfile创建容器方便多了.
启动的时候直接映射目录,ip,和一些启动资源配置:
docker run --name datamanagement -v $PWD:/xings/ \ --network host --cpus 1 -m 2G \ --ipc=host --memory-swap -1 datamanagement nohup java -jar -Xms1G -Xmx2G -Dspring.profiles.active=prod data-manager-agent-0.0.1-SNAPSHOT.jar >> datam.log 2>&1 &
完美解决, 比较坑的是 下面启动jar包的命令(nohup…)如果是写脚本一定不要换行, 不然就启动到宿主机了,另外不要加-d,启动后可以ctr+z终止, 不影响日志输出
错误连写范例:
docker run --name datamanagement -d -v $PWD:/xings/ \ --network host --cpus 1 -m 2G \ --ipc=host --memory-swap -1 datamanagement nohup java -jar -Xms1G -Xmx2G -Dspring.profiles.active=prod data-manager-agent-0.0.1-SNAPSHOT.jar >> datam.log 2>&1 &
心得
整体的一个启动脚本如下 docker.sh:
#!/bin/bash set -e basepath=$(cd `dirname $0`; pwd) function easy_start { nohup java -jar -Xms1G -Xmx2G -Dspring.profiles.active=prod /xings/data-manager-agent-0.0.1-SNAPSHOT.jar >> datam.log 2>&1 & } function start { docker run --name datamanagement -v $PWD:/xings/ \ --network host --cpus 1 -m 2G \ --ipc=host --memory-swap -1 datamanagement nohup java -jar -Xms1G -Xmx2G -Dspring.profiles.active=prod data-manager-agent-0.0.1-SNAPSHOT.jar >> datam.log 2>&1 & } function stop { docker rm -f datamanagement } function restart { stop $1 $2 $3 || return 1 start $1 $2 $3 || return 1 } $@
启动命令直接输入 sh docker.sh restart 即一键自动化删除原来容器并基于已有镜像去构造新的容器,$PWD:/xings/ 即是你关联映射的目录 PWD即你jar包所在路径,/xings/即是你容器中映射的路径,其实就是容器内/xings下和你现在的PWD目录下由于一模一样的东西, datam.log即可直接在宿主机查看日志信息, 并且后期按天切分,日志分析,错误回归查询等操作都很方便了。
docker看jar包日志
docker看jar包日志
docker ps -a
Error: No such container: 869c6eb7fe99
[root@kubernetes-work2 a7dea06507119d4d732094dad79d02f893e49311457225cd764321cee90f93c0]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2e33bd378260 zucc-gcsm-docker.pkg.coding.net/gcsm-web/gcsm-product/java-spring-app:master-596bf1cc48b9303eef33ac8ab5ea66dffe21d63c "java -jar ./GCSM-1.…" 25 hours ago Up 25 hours 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp java-spring-app
7143bb7bb5e8 minio/minio "/usr/bin/docker-ent…" 2 days ago Up 2 days 0.0.0.0:9000->9000/tcp, :::9000->9000/tcp, 0.0.0.0:9090->9090/tcp, :::9090->9090/tcp affectionate_wozniak
[root@kubernetes-work2 a7dea06507119d4d732094dad79d02f893e49311457225cd764321cee90f93c0]# docker logs -f java-spring-app
名字是
java-spring-app docker logs -f java-spring-app
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。