Docker 容器内时区错位排查:从 UTC 到 CST 与宿主机时间同步实操
【摘要】 部署上线后发现日志时间和数据库写入时间均比北京时间慢 8 小时。本文梳理常见容器基础镜像的时区调整方法与 Dockerfile 最佳实践。
将一个 Spring Boot / Node.js 镜像打包部署后,查看业务打印的日志发现时间总是不对劲,比如当前北京时间是 16:00,日志里打印的时间却是 08:00,整整相差 8 个小时。
一、原因定位
大部分官方基础镜像(如 Alpine、Ubuntu、Debian)默认采用 UTC(世界协调时)时区,而我们国内采用的是东八区 CST(UTC+8)。
进入容器运行 date 验证:
docker exec -it my_container date
Mon Oct 28 08:24:12 UTC 2026
确认容器内确实使用的是 UTC 时区。
二、不同场景下的修复方案
1. 快速临时方案:挂载宿主机 localtime
在 docker run 或 docker-compose.yml 中挂载宿主机的时区文件:
docker run -d \
-v /etc/localtime:/etc/localtime:ro \
-v /etc/timezone:/etc/timezone:ro \
--name my_app my_image:latest
2. 根本解决:在 Dockerfile 构建阶段固化时区
针对 Alpine 镜像:
FROM alpine:3.18
RUN apk add --no-cache tzdata \
&& cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo "Asia/Shanghai" > /etc/timezone \
&& apk del tzdata
针对 Debian/Ubuntu 镜像:
FROM debian:bullseye-slim
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
重新构建部署后再次执行 date,时区正确显示为 CST,日志与数据库时间恢复同步。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)