ClockRoom

Since April 2000

勝手気ままに楽しくつくる ClockRoom のウェブサイト

Contents - 目次

Topics - 最新情報

さくらのレンタルサーバ相当のDocker環境のCGIの時計をずらす方法

TL;DR

※以下、Apple Silicon + Debianの場合。

libfaketimeをインストール。

apt-get libfaketime

httpd.confで環境変数を設定。

SetEnv LD_PRELOAD "/usr/lib/aarch64-linux-gnu/faketime/libfaketime.so.1"
SetEnv FAKETIME "+7d"

目的

現在時刻に依存するCGIの動作確認のために時計をずらしたい。 プログラマーをやってたら一生付きまとう話。 Dockerコンテナ上ならそんなことも簡単だろうと高を括ってたら、最悪ホストOSの時計を巻き込むとかで、そう簡単な話ではなさそう。

解決方法

Linuxには時刻系関数をフックするそのものズバリなモジュール「libfaketime」がある。 それをインストールして環境変数を設定すればよいとのこと。

ハマりポイント

最初、ワイルドカードが最強だろうと環境変数をdocker-compose.ymlで設定。

environment:
  LD_PRELOAD: "/usr/lib/aarch64-linux-gnu/faketime/libfaketime.so.1"
  FAKETIME: "+7d"

Apacheのログやワンライナーの時計は期待通りにずれた。 ただし、CGIの時計は変わらない。 envvarsで設定してもダメ。 ならば強行手段、httpd-foregroundを修正したらコンテナがぶっ壊れた(爆) PID 1を触ってはいけない・・・

結論

最初に書いた通りhttpd.confで設定すればよい。 とても単純な話で、ApacheがCGIを実行する際にかなり堅固に環境変数をサニタイズするのが原因。 サニタイズするのは有名だけど、ただ、LD_PRELOADまで削がれるとは思わず、また、SetEnvで設定できるとも思わず。 二重の盲点にしてやられた(^^;

なお、httpd.confだけ設定した場合、当然ながらログやワンライナーの時計は変わらない。 CGI以外への副作用は避けたかったので怪我の功名。 今回は古典的なApache + CGIの場合。 FastCGIとかモジュールとかだと事情が全く変わると思う ────

others - その他