web-dev-qa-db-ja.com

Dockerコンテナーでシステム時刻を動的に設定する方法

ホストマシンに影響を与えずにDockerコンテナーのシステム時間を(実行時に)動的に設定する方法はありますか?

使用する

hwclock --set --date "Sat Aug 17 08:31:24 PDT 2016"

次のエラーが発生します。

hwclock: Cannot access the Hardware Clock via any known method.
hwclock: Use the --debug option to see the details of our search for an access method.

使用する

date -s "2 OCT 2006 18:00:00"

次のエラーが発生します。

date: cannot set date: Operation not permitted

ユースケース:

時間に敏感なソフトウェアをテストする必要があります(動作は日付によって異なります)。

その他の一般的な使用例:

  • y2Kバグのあるレガシーソフトウェアの実行
  • 2038年準拠のテストソフトウェア
  • 期限切れのSSL証明書などの時間関連の問題のデバッグ
  • 特定の時間枠の外で実行を停止する実行中のソフトウェア
  • 確定的ビルドプロセス。
32
Vingtoft

可能です

解決策は、それをコンテナで偽造することです。 このlib は、現在の日時を取得するために使用するすべてのシステムコールプログラムをインターセプトします。

実装は簡単です。必要に応じて、Dockerfileに機能を追加します。

WORKDIR /
RUN git clone https://github.com/wolfcw/libfaketime.git
WORKDIR /libfaketime/src
RUN make install

環境変数を設定することを忘れないでくださいLD_PRELOAD偽の時間を適用するアプリケーションを実行する前に。

例:

CMD ["/bin/sh", "-c", "LD_PRELOAD=/usr/local/lib/faketime/libfaketime.so.1 FAKETIME_NO_CACHE=1 python /srv/intercept/manage.py runserver 0.0.0.0:3000]

これで、サーバーの時間を動的に変更できます。

例:

import os
def set_time(request):
    print(datetime.today())
    os.environ["FAKETIME"] = "2020-01-01"  # Note: time of type string must be in the format "YYYY-MM-DD hh:mm:ss" or "+15d"
    print(datetime.today())
24
Vingtoft

Jenny Dは正解です。デフォルトでは、Dockerコンテナはシステムクロックへのアクセスを許可していません。

ただし、Linuxでは、コンテナーがこの機能にアクセスできる場合は、コンテナーの作成時に「docker run」コマンドの「--cap-add = SYS_TIME」オプションを使用してこの機能を許可できます。

# docker run --cap-add=SYS_TIME -d --name teamcity-server-instance -v /opt/teamcity/data:/data/teamcity_server/datadir -v /opt/teamcity/logs:/opt/teamcity/logs -p 80:8111 jetbrains/teamcity-server

次に、実行中のコンテナ内から時間を変更できます。

# docker exec -it teamcity-server-instance /bin/bash
# date +%T -s "15:03:00"
15:03:00
#

リファレンスドキュメント: https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities

5
Oleg Kazakov

docker-composeソリューション:

追加 /etc/localtime:/etc/localtime:rovolumes属性に追加します。

例については、この link を見てください。

0
Benyamin Jafari

追加の環境変数を使用してコンテナーを開始します。

docker run -e "SET_CONTAINER_TIMEZONE=true" \
           -e "CONTAINER_TIMEZONE=US/Arizona" [docker image name]
0
13dimitar