2024/05/02
Docker サーバ時刻を指定した日時にする方法
PHPとかで指定した日時になったと仮定してテストをしたい時に行える方法。
下記内容で、サーバーの時間を指定日時にする事が可能。
基本的にはDocker
用に記述をしているが、通常のLinuxでも有効。
下記の2つの方法を記述しているので、好きな方を参照するべし。
- Dockerfileに記述する場合
- コンテナ内で行う場合
使用するのは「libfaketime」
Dockerfileに記述する場合
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
を作成し、日時を記載するだけ。(下記コマンド)
echo -e '@2000-01-01 09:00:00' > /etc/faketimerc
環境設定
必要であれば下記をDockerfile
に追記する。
無くても良い。
# 時刻に関する関数を上書き
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
を作成し、日時を記載するだけ。(下記コマンド)
echo -e '@2000-01-01 09:00:00' > /etc/faketimerc
コンテナ内で行う場合
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
環境設定
必要であれば、下記のコマンドを叩く。
無くても良い。
# 時刻に関する関数を上書き
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
」を削除して、コンテナを再起動するだけ。
※コンテナに入って実行する必要あり
rm -rf /etc/ld.so.preload
逆にまた有効にしたい時は下記コマンドを実行。
echo -e '/usr/local/lib/faketime/libfaketime.so.1' > /etc/ld.so.preload
補足
コンテナに入って時間を変更していると、たまにコンソールが全く動かなくなる。
その際はCtrl + Cで一度抜けて、再度コンテナに入ればOK。