前言


由于公司使用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/ 即是你关联映射的目录 docker nohup docker nohup 打不出日志_dockerPWD目录下由于一模一样的东西, datam.log即可直接在宿主机查看日志信息, 并且后期按天切分,日志分析,错误回归查询等操作都很方便了.