容器时区时间修正

容器内时间少 8 小时,通常是由于 时区未设置正确,默认使用了 UTC(协调世界时),而中国时区是 UTC+8。


解决方案

方法 1:挂载宿主机的时区配置

如果宿主机的时间是正确的(比如已经设置为 Asia/Shanghai),可以直接在 docker rundocker-compose 中挂载时区相关文件:

1
2
3
volumes:
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro

或者 CLI 启动:

1
docker run -v /etc/localtime:/etc/localtime:ro -v /etc/timezone:/etc/timezone:ro ...

方法 2:设置环境变量 TZ

很多基础镜像(如 alpine, ubuntu, debian, nginx, mysql 等)支持通过环境变量设置时区:

1
2
environment:
- TZ=Asia/Shanghai

或 CLI:

1
docker run -e TZ=Asia/Shanghai ...

方法 3:容器内手动设置(不推荐,容器重启会失效)

如果你已经进入容器,可以手动安装 tzdata 并配置:

1
2
3
4
# 适用于 debian / ubuntu
apt update && apt install -y tzdata
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo "Asia/Shanghai" > /etc/timezone

检查时间

进入容器后使用以下命令查看时间:

1
date

推荐

在 Dockerfile 中设置:

1
ENV TZ=Asia/Shanghai

并结合 volume 方式确保宿主机时区同步:

1
2
volumes:
- /etc/localtime:/etc/localtime:ro