株式会社NextCodeのロゴ株式会社NextCode

BLOG

ブログ

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。

TOPへ移動
PAGE
TOP
%d人のブロガーが「いいね」をつけました。