V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
flycloud
V2EX  ›  Docker

docker 容器时间

  •  
  •   flycloud · 2021-11-25 17:50:31 +08:00 · 1432 次点击
    这是一个创建于 1080 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 打印的当前时间却和宿主机时间一致。

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

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

    至于为什么两个程序,一个可以一个不可以,你提供的信息太少,没法判断。
    另外,docker 目前好像不支持 time namespace
    flycloud
        5
    flycloud  
    OP
       2021-11-26 11:40:15 +08:00
    @Nitroethane 感谢,另外一个程序没有用 c 库,😭
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1139 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 23:49 · PVG 07:49 · LAX 15:49 · JFK 18:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.