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 \
`
-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时区。重新打包之后就能正常显示本地时间了。
这里简单做了一个测试:
总结下来就是,ubuntu和centos的基础镜像不一样,ubuntu镜像中默认没有包含tzdata,所以,使用环境变量TZ设置时间不会生效。centos镜像中已经包含了tzdata,所以通过设置环境变量的方式可以正常修改时区。
另外不管镜像内有没有tzdata,ubuntu/centos都可以通过挂载本地的timezone/localtime来修改时间。
比较奇怪的是,在ubuntu镜像中,如果同时使用TZ和timezone/localtime,那么设置就不会生效。