前言
部署完容器后,查看宿主的时间(date -R)如下:
Mon May 18 10:30:38 CST 2020
查看容器的时间是:
Mon May 18 02:35:01 UTC 2020
可以看出两者的时区不一样,宿主是CST,而容器默认是UTC。
单独查时区用:date +"%Z"
解决方法
同步参考。
使用环境变量ZT
使用docker run命令或者在Dockerfile中或者yml文件中指定TZ环境变量。
docker run
docker run -e TZ=Asia/Shanghai ...
Dockerfile
FROM openjdk:11.0.5-jre-slim
LABEL maintainer=Admin
ENV SPRING_PROFILES_ACTIVE=quilt
ENV TZ=Asia/Shanghai
WORKDIR /app
COPY . ./
ENTRYPOINT ["java", "-server", "-jar", "periscope-server-0.0.1-SNAPSHOT.jar"]
EXPOSE 8080
yml文件
version: "3.7"
networks:
xxl:
external: true
services:
quilt:
image: xxl.quilt:latest
networks:
- xxl
ports:
- "12307:12307"
volumes:
- ./server/quilt:/app/file:rw
environment:
- TZ=Asia/Shanghai
deploy:
replicas: 1
优势和缺点
优势就是操作简单,每个容器可以单独定义时区。缺点就是由于各种原因(人为配错等)可能导致和宿主的时区不同。
遗留问题
当容器启动以后,分别使用date命令和cat /etc/localtime,发现两者并不相同:

可能是ZT的优先级大于/etc/localtime吧。但是java服务器返回的时间是正常的。
挂载宿主的目录/etc/localtime
使用挂载目录时,容器启用后。分别用date和cat /etc/localtime查看时区,发现date和/etc/localtime的时区都没问题,但是java服务器的时间不对。所以不建议使用。
本文介绍了解决容器与宿主时区不同步的问题,通过设置环境变量TZ为特定时区,如Asia/Shanghai,可在Docker运行命令、Dockerfile或yml文件中实现。文章还探讨了使用/etc/localtime挂载的局限性。
1577

被折叠的 条评论
为什么被折叠?



