docker

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 云和虚拟化 > docker > docker启动jar包输出日志问题

docker启动jar包输出日志的问题以及解决

作者:vi__ky

这篇文章主要介绍了docker启动jar包输出日志的问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文