さくらのレンタルサーバ相当の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とかモジュールとかだと事情が全く変わると思う ────
