You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker环境Tomcat9时区错误、setenv.sh未加载及JMX/Prometheus配置问题

问题解决指南

一、Tomcat中Spring Boot应用时区快1小时的解决方法

虽然容器和宿主机时区显示为America/Sao_Paulo,但JVM或Spring Boot可能未同步该时区,导致时间偏差:

  • 强制JVM使用指定时区:修复setenv.sh加载问题后,在文件中添加JVM参数:
    JAVA_OPTS="$JAVA_OPTS -Duser.timezone=America/Sao_Paulo"
    
  • Spring Boot应用层指定时区:在application.properties或application.yml中添加配置:
    # application.properties
    spring.jackson.time-zone=America/Sao_Paulo
    
    # application.yml
    spring:
      jackson:
        time-zone: America/Sao_Paulo
    
  • 验证时区生效:在应用中添加日志输出当前时区,比如:
    System.out.println("Current JVM TimeZone: " + TimeZone.getDefault().getID());
    
    启动后查看日志是否显示America/Sao_Paulo。

二、setenv.sh未加载导致JMX、JMX Exporter失效的解决方法

Tomcat默认只会加载CATALINA_BASE/bin/setenv.sh,需从路径、权限、配置三方面排查:

  1. 确认文件路径:
    确保setenv.sh放在Tomcat的bin目录下,容器中通常是/usr/local/tomcat/bin/setenv.sh,可通过Tomcat启动日志中的CATALINA_BASE路径确认。
  2. 设置可执行权限:
    容器内必须给setenv.sh添加可执行权限,否则Tomcat会跳过加载:
    • 构建镜像时在Dockerfile中添加:
      COPY setenv.sh /usr/local/tomcat/bin/
      RUN chmod +x /usr/local/tomcat/bin/setenv.sh
      
    • 用docker-compose挂载时,可通过command先授权再启动:
      services:
        tomcat:
          # 其他配置
          command: sh -c "chmod +x /usr/local/tomcat/bin/setenv.sh && catalina.sh run"
          volumes:
            - ./setenv.sh:/usr/local/tomcat/bin/setenv.sh:ro
      
  3. 验证setenv.sh是否加载:
    在setenv.sh开头添加一行测试输出:
    echo "[INFO] setenv.sh has been loaded successfully"
    
    重启Tomcat后查看启动日志,若能看到该信息,说明加载正常;若看不到,重新检查路径和权限。
  4. 正确配置JMX与JMX Exporter参数:
    在setenv.sh中添加完整的JMX和JMX Exporter配置(替换路径为容器内实际路径):
    # JMX远程访问配置
    JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote=true"
    JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.port=9000"
    JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.rmi.port=9000"
    JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.authenticate=false"
    JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.ssl=false"
    JAVA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=0.0.0.0"
    
    # Prometheus JMX Exporter配置
    JAVA_OPTS="$JAVA_OPTS -javaagent:/usr/local/tomcat/lib/jmx_prometheus_javaagent.jar=9100:/usr/local/tomcat/conf/jmx-exporter-config.yaml"
    
  5. 避免直接修改catalina.sh:
    Tomcat官方不建议直接修改catalina.sh,后续版本更新可能会覆盖该文件,坚持使用setenv.sh是标准做法。

内容的提问来源于stack exchange,提问作者Alan Aguinaga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 20:40:18