docker 运行第三方容器, 容器内的时间无法调整?

docker 运行示例如下

docker run -it --name logstashTest  \
-p 9600:9600  \
-p 5044:5044  \
-e TZ="Asia/Shanghai" \
-v /etc/localtime:/etc/localtime:ro \
-v /etc/timezone:/etc/timezone:ro \
-d logstash:8.4.3

网上找的相关示例,无外乎下面三种方式, 但我的测试却是全都不生效

-e TZ="Asia/Shanghai" \
-v /etc/localtime:/etc/localtime:ro \
-v /etc/timezone:/etc/timezone:ro \
以上方法,CentOS和Ubuntu都试过, 不额外在容器内安装工具, 不直接date -s 设置的情况下, 还有什么方法可以实现同步宿主机的时间吗?
阅读 4.5k
2 个回答

`
-e TZ="Asia/Shanghai" \
-v /etc/localtime:/etc/localtime:ro \
-v /etc/timezone:/etc/timezone:ro \
`

这里设置TZ并且生效的前提是镜像里面包含tzdata这个包。如果没有就不会生效了。

logstash镜像是基于ubuntu:20.04,默认是不包含tzdata的。


不知道你的目的是不是要解决logstash,记录的时间和显示的不一样。如果是这个问题的话,大概率和修改系统/容器的时间没关系。

之前遇到过的这个问题,解决方案是:修改logstash源代码,把UTC+0时区改为UTC+8时区。重新打包之后就能正常显示本地时间了。


这里简单做了一个测试:

# 使用centos:7镜像,使用TZ设置时区,容器内的时间是本地+8时区
$ docker run --rm -it -e TZ=Asia/Shanghai centos:7
[root@d66acc7eaed4 /]# date
Sat Jul  8 10:28:44 CST 2023

# 使用ubuntu:22.04镜像,使用TZ使用TZ设置时区,容器内的时间还是UTC 0时间
$ docker run --rm -it -e TZ=Asia/Shanghai ubuntu:22.04
root@0e457f2e9a58:/# date
Sat Jul  8 02:28:56 Asia 2023

# 在ubuntu:22.04镜像里添加tzdata包。
$ cat Dockerfile
FROM ubuntu:22.04
RUN apt update && apt install -y tzdata
ENTRYPOINT bash

# 使用添加了tzdata包的ubuntu镜像,并使用TZ设置时区,容器内时间是本地时间
$ docker run --rm -it -e TZ=Asia/Shanghai ubuntu-tz:22.04
root@526e8ed5d828:/# date
Sat Jul  8 10:29:19 CST 2023
# 在ubuntu:22.04镜像中 使用挂载localtime/timezone的方式修改时间,容器内的时间是本地时间
$ docker run --rm -it -v /etc/localtime:/etc/localtime:ro -v /etc/timezone:/etc/timezone:ro ubuntu:22.04
root@549a981d8444:/# date
Sat Jul  8 10:33:36 CST 2023

# 在centos:7镜像中 使用挂载localtime/timezone的方式修改时间,容器内的时间是本地时间
$ docker run --rm -it -v /etc/localtime:/etc/localtime:ro -v /etc/timezone:/etc/timezone:ro centos:7
[root@180912646c2a /]# date
Sat Jul  8 10:33:58 CST 2023

# 在centos:7镜像中 使用挂载localtime/timezone的方式加指定TZ的方式修改时间,容器内的时间是本地时间
$ docker run --rm -it -v /etc/localtime:/etc/localtime:ro -v /etc/timezone:/etc/timezone:ro -e TZ=Asia/Shanghai centos:7
[root@834f09f7c73f /]# date
Sat Jul  8 10:34:13 CST 2023

# 在ubuntu:22.04镜像中 使用挂载localtime/timezone的方式加指定TZ的方式修改时间,容器内的时间是UTC0时间
$ docker run --rm -it -v /etc/localtime:/etc/localtime:ro -v /etc/timezone:/etc/timezone:ro -e TZ=Asia/Shanghai ubuntu:22.04
root@c8c0e3e5b528:/# date
Sat Jul  8 02:34:27 Asia 2023

总结下来就是,ubuntu和centos的基础镜像不一样,ubuntu镜像中默认没有包含tzdata,所以,使用环境变量TZ设置时间不会生效。centos镜像中已经包含了tzdata,所以通过设置环境变量的方式可以正常修改时区。

另外不管镜像内有没有tzdata,ubuntu/centos都可以通过挂载本地的timezone/localtime来修改时间。

比较奇怪的是,在ubuntu镜像中,如果同时使用TZ和timezone/localtime,那么设置就不会生效。

    volumes:
    - /etc/localtime:/etc/localtime:rw
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进