Docker 容器时间不对?时区问题排查

Cold 发布于 2024-06-09 48 次阅读 257 字 预计阅读时间: 1 分钟 Linux服务器


容器里跑 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'

时区问题看着小,但排查起来容易绕弯路。容器化之后,系统时区、应用时区、数据库时区要分别确认。

和喜欢的一切在一起~
最后更新于 2024-06-09