通过Docker部署Java项目的日志输出到宿主机指定目录

方法有2种:

1、在Docker容器内部加入日志收集工具,Filebeat或Logstash。

2、将打Docker内的日志打印到宿主机的目录。

本文用的第二种,下面再慢慢说思路,开始叻

先看项目不迷糊

1、首先 Dockerfile 里的 ENTRYPOINT配置Java日志输出无果

# 基础镜像使用JavaFROMjava:8LABEL name=shop-client-prodLABEL version=v0.0.1# 将jar包添加到容器中并更名为# 注意:这个jar包文件名,请前方服务器 目录查看COPY/shop-client/target/shop-client-1.0-SNAPSHOT.jar /usr/local/app/client.jar# 容器暴露端口EXPOSE7071# 这个暂且不用# COPY target/lib /app/libENTRYPOINT["nohup","java","-Djava.security.egd=file:/dev/./urandom","-jar","-Dspring.profiles.active=master","/usr/local/app/shop-client.jar",">client.out","&"]

改为执行shell脚本的方式,把启动Jar的指令拆出来

# 基础镜像使用JavaFROMjava:8LABEL name=shop-client-prodLABEL version=v0.0.1# 将jar包添加到容器中并更名为# 注意:这个jar包文件名,请前方服务器 目录查看COPY/shop-client/target/shop-client-1.0-SNAPSHOT.jar /usr/local/app/client.jarCOPY /shop-client/clientStart.sh /usr/bin/clientStart.sh# 数据卷VOLUME/usr/local/app/logos# 容器暴露端口EXPOSE7071RUN chmod +x /usr/bin/clientStart.shCMD["sh","/usr/bin/clientStart.sh"]

2、项目路径下创建clientStart.sh文件,用于启动Jar包

#!/bin/bash# author: Linnuo# date: 2021-12-16# Filename: clientStart.sh# Description: 启动客户端后台nohup java -Djava.security.egd=file:/dev/./urandom -jar -Dspring.profiles.active=dev /usr/local/app/client.jar --server.port=7071 >/usr/local/app/logs/client.out

这里启动Jar不要后台运行

3、gitlab-ci.yml 文件修改Docker的启动命令

# 第1步client:  image: maven:3-jdk-8  stage: client  only:    - master  script:    - mvn clean package# 创建shop-client镜像- sudo docker build -t$CI_REGISTRY_CLIENT_IMAGE-f./shop-client/Dockerfile .# 推送到阿里云镜像库- sudo docker push$CI_REGISTRY_CLIENT_IMAGE# 从阿里云拉取镜像- sudo docker pull$CI_REGISTRY_CLIENT_IMAGE# 先把之前存在的容器删除- CONTAINER_ID=$(sudo docker container ps-a-f"name=$CI_CLIENT_IMAGE"--format {{.ID}})    -echo"previous container id is$CONTAINER_ID"-if[ -z"$CONTAINER_ID"];thenecho"没有运行的容器";elsesudo docker stop$CONTAINER_ID;sudo docker rm$CONTAINER_ID;fi# 把之前同名同版本的镜像A删除,否则A标签会变为 - EXIST_IMAGES=$(sudo docker images-f="dangling=true"-f"label=name=$CI_CLIENT_IMAGE"-f"label=version=$VERSION"--format {{.ID}})    -if[ -z"$EXIST_IMAGES"];thenecho"没有冲突镜像";elsesudo docker rmi$EXIST_IMAGES;fi# 获取最新镜像- IMAGE_ID=$(sudo docker images-f="dangling=false"-f"label=name=$CI_CLIENT_IMAGE"-f"label=version=$VERSION"--format {{.ID}})    -echo"current image id is$IMAGE_ID"### 重新构建镜像,8181端口是服务器的端口,8080端口是容器的端口,即项目中设置的端口(默认8080)- sudo docker run-d--name$CI_CLIENT_IMAGE--net=host$IMAGE_IDtags:    - robot-shop-prod-tag

修改 sudo docker run 启动这行即可,如下:

- sudo dockerrun-eTZ="Asia/Shanghai"-itd -v /usr/local/server/mall_server:/usr/local/app/logs:z --privileged=true--name$CI_CLIENT_IMAGE--net=host$IMAGE_ID

这里说一下:

-e TZ="Asia/Shanghai"#指定服务器时区,默认格林威治时间-itd#后台运行伪装,不然输出不了日志文件-v/usr/local/server/mall_server:/usr/local/app/logs:z#将宿主机目录挂载到容器内对应路径,并容器共享路径--privileged=true#授权,让容器获取宿主机root权限

Ok, 进到宿主机服务器目录就可以看到你的日志啦

cd/usr/local/server/mall_server

你可能感兴趣的:(通过Docker部署Java项目的日志输出到宿主机指定目录)