通過Docker部署Java項目的日誌輸出到宿主機指定目錄

之前寫過2篇關於Docker部署的文章:

1、超!超!超簡單,Linux安裝Docker

2、Docker通過阿里雲鏡像倉庫使用Gitlab_CI部署SpringBoot項目

 

用上篇部落格部署Java程式是ok的,不過Java日誌列印在容器里,不能滿足原來ELK的日誌搜集

方法有2種:

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

2、將打Docker內的日誌列印到宿主機的目錄。

 

本文用的第二種,下面再慢慢說思路,開始叻

先看項目不迷糊

 

1、首先 Dockerfile 里的 ENTRYPOINT配置Java日誌輸出無果

# 基礎鏡像使用Java
FROM java:8
LABEL name=shop-client-prod
LABEL version=v0.0.1
# 將jar包添加到容器中並更名為
# 注意:這個jar包文件名,請前方伺服器 目錄查看
COPY /shop-client/target/shop-client-1.0-SNAPSHOT.jar /usr/local/app/client.jar
# 容器暴露埠
EXPOSE 7071
# 這個暫且不用
# COPY target/lib /app/lib
ENTRYPOINT ["nohup","java","-Djava.security.egd=file:/dev/./urandom","-jar","-Dspring.profiles.active=master","/usr/local/app/shop-client.jar", ">client.out" , "&"]

  改為執行shell腳本的方式,把啟動Jar的指令拆出來

# 基礎鏡像使用Java
FROM java:8
LABEL name=shop-client-prod
LABEL version=v0.0.1
# 將jar包添加到容器中並更名為
# 注意:這個jar包文件名,請前方伺服器 目錄查看
COPY /shop-client/target/shop-client-1.0-SNAPSHOT.jar /usr/local/app/client.jar
COPY /shop-client/clientStart.sh /usr/bin/clientStart.sh
# 數據卷
VOLUME /usr/local/app/logos
# 容器暴露埠
EXPOSE 7071
RUN chmod +x /usr/bin/clientStart.sh
CMD ["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" ]; then echo "沒有運行的容器";else sudo docker stop $CONTAINER_ID;sudo docker rm $CONTAINER_ID; fi
    # 把之前同名同版本的鏡像A刪除,否則A標籤會變為 <none>
    - EXIST_IMAGES=$(sudo docker images -f="dangling=true" -f "label=name=$CI_CLIENT_IMAGE" -f "label=version=$VERSION" --format {{.ID}})
    - if [ -z "$EXIST_IMAGES" ]; then echo "沒有衝突鏡像";else sudo 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_ID
  tags:
    - robot-shop-prod-tag

  修改 sudo docker run 啟動這行即可,如下:

- sudo docker run -e TZ="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

 喜大普奔