技术科普
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 版本
- 不要依赖宿主机时区,保持容器可移植
容器时区问题的本质是“环境隔离”。显式配置比隐式继承更可靠。