ホストマシンに影響を与えずに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
ユースケース:
時間に敏感なソフトウェアをテストする必要があります(動作は日付によって異なります)。
その他の一般的な使用例:
可能です
解決策は、それをコンテナで偽造することです。 この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())
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
追加の環境変数を使用してコンテナーを開始します。
docker run -e "SET_CONTAINER_TIMEZONE=true" \
-e "CONTAINER_TIMEZONE=US/Arizona" [docker image name]