zoukankan      html  css  js  c++  java
  • 通过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

      提交到Gitlab。

      这里说一下:

    -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
  • 相关阅读:
    Python实现机器人聊天
    node.js使用express框架进行文件上传
    nginx让所有的http地址重定向到https
    nginx配置https
    vscode源码编译运行打包使其由英文变为中文
    阿里云配置tomcat https
    springboot打成的jar包如何在Linux上持久运行
    wordpress数据表分析
    DevExpress Components16.2.6 Source Code 重编译教程
    DataGridView绑定泛型List时,利用BindingList来实现增删查改
  • 原文地址:https://www.cnblogs.com/linnuo/p/15699121.html
Copyright © 2011-2022 走看看