解决Docker容器内时区问题

查看时区

以Jenkins为例

Jenkins容器内时间

1
2
date
Wed Aug 17 10:35:43 UTC 2022

宿主机时间

1
2
date
Wed Aug 17 18:35:15 CST 2022

发现两者的时间相差8个小时

  • 容器采用了UTC时区,UTC是指(Coordinated Universal Time,标准时间)
  • 宿主机采用了CST时区,CST是指(China Shanghai Time,东八区时间)

解决 /etc/localtime (3选1)

一、容器内复制上海时区

1
2
3
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
date
Wed Aug 17 18:46:11 CST 2022

如果提示Permission denied(没有权限),就在命令中加入--user=root,如:docker exec -it --user=root joplin /bin/bash

二、共享主机的localtime

创建容器的时候指定启动参数,挂载localtime文件到容器内,保证两者所采用的时区是一致的。

  • docker命令添加: -v /etc/localtime:/etc/localtime:ro
  • docker-compose添加:
    1
    2
    volumes:
    - /etc/localtime:/etc/localtime:ro

三、复制主机的localtime

1
docker cp /etc/localtime jenkins:/etc/

此时容器的时间已经设置成和宿主机相同的时间


解决 /etc/timezone

查看当前时区

1
2
cat /etc/timezone
Etc/UTC

我们需要把UTC改为CST,或者在UTC的基础上加8小时

1
2
3
sed -i 's/UTC/UTC+8/' /etc/timezone
cat /etc/timezone
Etc/UTC+8

重启jenkins

1
docker restart jenkins