容器里跑 PHP,日志时间比北京时间少 8 小时。宿主机时间是对的,容器里 date 显示 UTC。
原因
基础镜像默认时区是 UTC,容器不会自动继承宿主机的时区。
解决方案
方案一:挂载宿主机时区文件
docker run -v /etc/localtime:/etc/localtime:ro -v /etc/timezone:/etc/timezone:ro your-image
方案二:Dockerfile 里设置
FROM php:8.1-fpm
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo "Asia/Shanghai" > /etc/timezone
# 或者
ENV TZ=Asia/Shanghai
方案三:docker-compose 里配
services:
app:
image: your-image
environment:
- TZ=Asia/Shanghai
volumes:
- /etc/localtime:/etc/localtime:ro
PHP 特有的坑
改完系统时区,PHP 可能还是 UTC,因为 php.ini 里 date.timezone 没设。加一行:
date.timezone = Asia/Shanghai
MySQL 容器
MySQL 容器还要注意 --default-time-zone='+08:00',否则 NOW() 返回 UTC 时间。
command: --default-time-zone='+08:00'
时区问题看着小,但排查起来容易绕弯路。容器化之后,系统时区、应用时区、数据库时区要分别确认。

Comments 3 条评论
容器不继承宿主机时区这点没注意过
php.ini 里的时区我也漏过
MySQL 容器还要单独设时区,坑