我有一个在 Tomcat8 上运行的 SprintBoot Web 应用程序。它的三个实例运行在不同的 docker 容器中。
有一天,其中一个应用实例的日志时间从GMT+8变成了GMT,相差了8个小时。并且与时间相关的接口异常。
另外两个实例的时间相关接口和日志时间均为预计北京时间(GMT+8)。
三个实例均使用外部配置中心,其中 spring.jackson.time-zone=GMT+8,所以应该不会出现配置不一致的情况。
我对比了三个实例的相关环境变量,没有发现与时间TZ和时区相关的覆盖配置。
还有其他方法可以定位并解决这个问题吗?期待您的回复
PS:docker容器是centos系统
该属性仅适用于杰克逊,不适用于系统。所有时间(例如通过
System.currentMillis()
检索的时间)都使用操作系统时区(即容器的时区)。要设置容器的时区,您有三个选项:
docker run
命令中设置您可以在运行容器时通过使用
-e
选项传递时区环境变量来设置时区。
示例:
docker run -e TZ=America/New_York <image>
将
America/New_York
替换为您所需的时区,将 <image>
替换为您的 Docker 映像的名称。
您可以通过配置环境变量并安装时区数据,直接在 Dockerfile 中设置时区。
示例:
FROM ubuntu:latest
# Set the time zone environment variable
ENV TZ=America/New_York
# Install tzdata and set the time zone
RUN apt-get update && \
apt-get install -y tzdata && \
ln -fs /usr/share/zoneinfo/$TZ /etc/localtime && \
dpkg-reconfigure --frontend noninteractive tzdata
此 Dockerfile 在 Docker 映像的构建过程中将时区设置为
America/New_York
。
/etc/timezone
挂载到容器您可以将主机的时区配置文件挂载到容器中,以确保容器与主机使用相同的时区。
示例:
docker run -v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro <image>
这会将容器的时区配置与主机的时区链接起来,使它们保持一致。