docker 容器时间

2021-11-25 17:50:31 +08:00
 flycloud

Dockerfile 文件:

FROM bitnami/minideb

WORKDIR /data/gmsvr

ADD libfaketime.so.1 /data/gmsvr/

ADD test /data/gmsvr/

ADD gmsvr /data/gmsvr/

CMD ["/data/gmsvr/gmsvr", "-f", "/data/gmsvr/config/config.ini"]

通过 faketime 把容器内的系统时间修改了,但是容器内通过 CMD 执行的进程打印出来的时候还是和宿主机时间一致,而不是和容器的系统时间一致。

但是执行:docker exec -it gmsvr /bin/bash ,进入容器,执行 test 程序会打印当前系统时间,是和容器系统时间一致的,但是执行 /data/gmsvr/gmsvr 打印的当前时间却和宿主机时间一致。

太懵逼了,请问这是什么原因呢?

1472 次点击
所在节点    Docker
5 条回复
defunct9
2021-11-25 17:53:44 +08:00
没看懂说的是什么
yangyaofei
2021-11-25 18:12:47 +08:00
读的东西不一样吧,可能. 我记得原来有可能不同步的时候, 是把 /etc/localtime 做映射, 不知道是不是利用类似的方法就可以了
anubu
2021-11-25 18:19:19 +08:00
可以看下 faketime 的说明,并不是所有程序都会接收这个 fake ,或者需要附加参数,比如 JVM 就需要。
Nitroethane
2021-11-25 20:35:46 +08:00
刚看了下 faketime 这个库,修改系统时间的原理是通过首先加载 libfaketime.so 共享库实现对时间相关系统调用的劫持。所以 libfaketime.so 共享库要先于 c 库加载才能实现劫持,也就是 faketime readme 中 usage 部分最开始提到的通过 LD_PRELOAD 实现劫持的方法。

至于为什么两个程序,一个可以一个不可以,你提供的信息太少,没法判断。
另外,docker 目前好像不支持 time namespace
flycloud
2021-11-26 11:40:15 +08:00
@Nitroethane 感谢,另外一个程序没有用 c 库,😭

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/817981

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX