Docker 内の Linux の日時を一時的に変更する方法

Docker

Docker 内の Linux の日時を一時的に変更するには libfaketime が便利でした。

他にもいくつかの方法があるようですが、私が調べて把握したかぎり libfaketime を使う方法は以下の点で他の選択肢よりもシンプルでよい感じでした。

  • ホストマシンの日時に影響を与えないので気軽に使える
  • コンテナに追加の権限を与えなくてもよい
  • インストール・セットアップがかんたん

確認時の libfaketime のバージョンは 0.9.10 です。

libfaketime とは

libfaketime は擬似的にシステムの日時を変更できるライブラリです。 現在日時の取得のために使われるシステムコールをインターセプトして偽の日時を返してくれます。 実際にはシステム日時は変更せずに他のプログラムが認識するシステム日時を変更できます。

libfaketime intercepts various system calls that programs use to retrieve the current date and time. It then reports modified (faked) dates and times (as specified by you, the user) to these programs. This means you can modify the system time a program sees without having to change the time system-wide.

libfaketime は 擬似的な日時を設定する方法を 5 つ用意しています。

  • a) 環境変数 FAKETIME をセットする
  • b) 環境変数 FAKETIME_TIMESTAMP_FILE で指定されたファイルを使う
  • c) ホームディレクトリ直下のファイル .faketimerc を使う
  • d) ファイル /etc/faketimerc を使う
  • e) 環境変数 FAKETIME_UPDATE_TIMESTAMP_FILE をセットした上でコマンド date -s <time> などで日時を変更する
  • a) By setting the environment variable FAKETIME.
  • b) By using the file given in the environment variable FAKETIME_TIMESTAMP_FILE
  • c) By using the file .faketimerc in your home directory.
  • d) By using the file /etc/faketimerc for a system-wide default.
  • e) By using FAKETIME_UPDATE_TIMESTAMP_FILE and date -s "

libfaketime を Docker で使うサンプル

debian:12 ベースのサンプルです。

Dockerfile:

FROM debian:12

# libfaketime をインストール
RUN apt-get update && \
  apt-get install -y \
    libfaketime \
    && \
  rm -rf /var/lib/apt/lists/*

# LD_PRELOAD をセット
ARG ARCH
ENV LD_PRELOAD=/usr/lib/${ARCH}-linux-gnu/faketime/libfaketime.so.1

利用するには libfaketime をインストールして環境変数 LD_PRELOAD を適切にセットする必要があります。

試しに Docker Compose で動かしてみます。

compose.yaml:

services:
  app:
    build:
      context: .
      args:
        ARCH: aarch64

私の手元の Apple Silicon の Mac の場合はビルド args として ARCH=aarch64 を渡す必要がありました。 異なる環境では別の値をセットする必要があります。

動かします。 試しに日時を 2023-05-27 00:00:00 にセットします。

docker compose run --rm -it app bash

eeaa8ee54d81:/# date
Fri May 31 01:51:54 UTC 2024

eeaa8ee54d81:/# echo '2030-05-27 00:00:00' > /etc/faketimerc

eeaa8ee54d81:/# date
Mon May 27 00:00:00 UTC 2030

eeaa8ee54d81:/# rm /etc/faketimerc

eeaa8ee54d81:/# date
Fri May 31 01:52:30 UTC 2024

いい感じに動きました。

今回は Docker コンテナ内で使いましたが、 libfaketime は Docker での利用に限定されたものではないため Docker に関係ないところでも使えます。


アバター
後藤隼人 ( ごとうはやと )

Python や PHP を使ってソフトウェア開発やウェブ制作をしています。詳しくはこちら