技术科普

Docker 容器时区:为什么默认是 UTC

许多 Docker 镜像默认使用 UTC,因为基础镜像通常不设置本地时区。这会让容器日志和业务时间与宿主机不一致。

方法一:TZ 环境变量

运行容器时设置:

docker run -e TZ=Asia/Shanghai myapp

大多数程序会读取 TZ 变量。但前提是镜像内安装了时区数据库,否则可能无效。

方法二:安装 tzdata

Debian/Ubuntu 镜像可安装:

RUN apt-get update && apt-get install -y tzdata

Alpine 镜像使用 apk add tzdata。slim 镜像常缺少时区文件,需要显式安装。

方法三:挂载时区文件

将宿主机的时区文件挂载进容器:

docker run -v /etc/localtime:/etc/localtime:ro -v /etc/timezone:/etc/timezone:ro myapp

这样容器与宿主机使用同一时区,但可移植性较差。

最佳实践

  • 应用内部统一使用 UTC 存储和计算
  • 仅在展示层按用户时区转换
  • 日志使用 UTC 或明确标注偏移
  • 镜像构建时固定 tzdata 版本
  • 不要依赖宿主机时区,保持容器可移植

容器时区问题的本质是“环境隔离”。显式配置比隐式继承更可靠。