2024/05/02
Docker サーバ時刻を指定した日時にする方法
PHPとかで指定した日時になったと仮定してテストをしたい時に行える方法。
下記内容で、サーバーの時間を指定日時にする事が可能。
基本的にはDocker
用に記述をしているが、通常のLinuxでも有効。
下記の2つの方法を記述しているので、好きな方を参照するべし。
- Dockerfileに記述する場合
- コンテナ内で行う場合
使用するのは「libfaketime」
Dockerfileに記述する場合
1 2 3 4 5 6 | RUN yum install -y gcc git make WORKDIR / RUN git clone https: //github .com /wolfcw/libfaketime .git WORKDIR /libfaketime/src RUN make install \ && echo -e '/usr/local/lib/faketime/libfaketime.so.1' > /etc/ld .so.preload |
あとは下記コマンドなどで/etc/faketimerc
を作成し、日時を記載するだけ。(下記コマンド)
1 | echo -e '@2000-01-01 09:00:00' > /etc/faketimerc |
環境設定
必要であれば下記をDockerfile
に追記する。
無くても良い。
1 2 3 4 5 6 7 8 9 10 11 12 | # 時刻に関する関数を上書き ENV LD_PRELOAD= /usr/local/lib/faketime/libfaketime .so.1 # Javaを実行する可能性があるなら必要 ENV DONT_FAKE_MONOTONIC=1 # 時刻設定のキャッシュをさせない ENV FAKETIME_NO_CACHE=1 # 時刻設定のキャッシュ秒数 ENV FAKETIME_CACHE_DURATION=60 # 時刻設定ファイル(/etc/faketimerc以外を使用する場合) ENV FAKETIME_TIMESTAMP_FILE= /tmp/faketimerc # /etc/faketimerc以外の時刻設定ファイルを使用するフラグ ENV FAKETIME_UPDATE_TIMESTAMP_FILE=1 |
あとは下記コマンドなどで/etc/faketimerc
を作成し、日時を記載するだけ。(下記コマンド)
1 | echo -e '@2000-01-01 09:00:00' > /etc/faketimerc |
コンテナ内で行う場合
1 2 3 4 | yum install -y gcc git make cd / && git clone https: //github .com /wolfcw/libfaketime .git cd /libfaketime/src && make install echo -e '/usr/local/lib/faketime/libfaketime.so.1' > /etc/ld .so.preload |
環境設定
必要であれば、下記のコマンドを叩く。
無くても良い。
1 2 3 4 5 6 7 8 9 10 11 12 | # 時刻に関する関数を上書き export LD_PRELOAD= /usr/local/lib/faketime/libfaketime .so.1 # Javaを実行する可能性があるなら必要 export DONT_FAKE_MONOTONIC=1 # 時刻設定のキャッシュをさせない export FAKETIME_NO_CACHE=1 # 時刻設定のキャッシュ秒数 export FAKETIME_CACHE_DURATION=60 # 時刻設定ファイル(/etc/faketimerc以外を使用する場合) export FAKETIME_TIMESTAMP_FILE= /tmp/faketimerc # /etc/faketimerc以外の時刻設定ファイルを使用するフラグ export FAKETIME_UPDATE_TIMESTAMP_FILE=1 |
最後に、コンテナの再起動が必要。
ただし、コンテナを再起動するとexport
で設定した内容は消えるので、bashrc
などで永続化する必要あり。
元に戻す方法
「/etc/ld.so.preload
」を削除して、コンテナを再起動するだけ。
※コンテナに入って実行する必要あり
1 | rm -rf /etc/ld .so.preload |
逆にまた有効にしたい時は下記コマンドを実行。
1 | echo -e '/usr/local/lib/faketime/libfaketime.so.1' > /etc/ld .so.preload |
補足
コンテナに入って時間を変更していると、たまにコンソールが全く動かなくなる。
その際はCtrl + Cで一度抜けて、再度コンテナに入ればOK。