【问题标题】:How can I temporarily change the time in my ddev web container如何临时更改 ddev Web 容器中的时间
【发布时间】:2021-04-27 08:40:19
【问题描述】:

我正在尝试调试在另一个事件发生几天后发生的事情,并希望在不绕过与日期延迟相关的代码的情况下加快测试速度。有没有办法临时更改 ddev 容器中的日期?

【问题讨论】:

    标签: docker date dockerfile ddev


    【解决方案1】:

    感谢this question 的帮助和@rfay 的友好支持。我使用libfaketime提出了这个解决方案

    我创建了.ddev/web-build/Dockerfile,内容如下:

    ARG BASE_IMAGE
    FROM $BASE_IMAGE
    RUN apt-get update && apt-get install -y make build-essential
    WORKDIR /
    RUN git clone https://github.com/wolfcw/libfaketime.git
    WORKDIR /libfaketime/src
    RUN make install
    

    我运行了ddev start 以确保容器仍然可以构建。

    然后在.ddev/commands/host/faketime添加一个命令:

    #!/bin/bash
    
    ## Description: Enable or disable faketime
    ## Usage: faketime on YYYY-mm-dd|off|status
    ## Example: "ddev faketime on 2020-05-04", "ddev faketime off", "ddev faketime status"
    
    if [ $# -eq 0 ] ; then
     echo "usage faketime YYYY-mm-dd or faketime off"
    fi
    
    case $1 in
        on|true|enable)
        echo $1
        echo $2
        echo "turning on"
          if date -j -f "%Y-%m-%d" -j ${2} > /dev/null 2>&1
          then
            echo "time set to ${2} 11:00:00, restarting..."
          ddev config --web-environment=LD_PRELOAD="/usr/local/lib/faketime/libfaketime.so.1",FAKETIME="${2} 11:00:00" && ddev start
        else
          echo "faketime on usage:  ddev faketime on YYYY-MM-DD"
        fi
        ;;
        off|false|disable)
          echo "turning faketime off"
          ddev config --web-environment=LD_PRELOAD="" && ddev start
        ;;
        status)
          if grep -q 'FAKETIME' ${DDEV_APPROOT}/.ddev/config.yaml;
          then
            echo "faketime is on."
            ddev exec date +%F
          else
            echo "faketime is off."
            ddev exec date +%F
          fi
        ;;
      *)
        echo "invalid argument"
        ;;
    esac
    

    在 Mac 上,这允许我运行 ddev faketime on 2020-05-4 将容器日期设置为 2020 年 5 月 4 日,并运行 ddev faketime off 将其关闭。在基于 Unix 的系统上,脚本的日期验证部分需要有所不同。

    if date -j -f "%Y-%m-%d" -j ${2} > /dev/null 2>&1;

    应该是这样的

    if date "+%Y-%m-%d" -d ${2} 2>&1;

    faketime offfaketime on 都会导致容器重新启动,而faketime status 只会读取时间是否被伪造并报告当前容器日期。

    就我而言,将时间设置为上午 11 点就可以了。我只关心日期本身。对于您的应用程序,您可能还需要更改参数并指定时间。

    【讨论】:

      猜你喜欢
      • 2023-04-07
      • 1970-01-01
      • 2018-12-06
      • 2019-12-27
      • 2018-09-08
      • 2012-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多