※当サイトの記事には、広告・プロモーションが含まれます。

docker compose logs --sinceのタイムゾーンはデフォルトだとDockerホスト側のままが利用される

nazology.kusuguru.co.jp

国際共同研究チームによって行われた最新の研究により、宇宙の謎の一つである超高エネルギー宇宙線には陽子以外のより重い元素がかなりの割合で含まれていることが明らかになりました。

ついに超高エネルギー宇宙線の謎が解けたかもしれない - ナゾロジー

研究では南極の氷の下に埋設されたニュートリノ観測施設IceCube(アイスキューブ)で約13年間にわたって得られたデータの解析が行われており、これまで広く支持されてきた「宇宙線はほぼすべて陽子である」というモデルは95%という高い信頼度で否定されたのです。

ついに超高エネルギー宇宙線の謎が解けたかもしれない - ナゾロジー

⇧ 従来の研究が正確な検証が実現できておらず、仮説の域を出ていなかったということですかね...

当時の技術的に検証する術が無かったのなら致し方ないとは思いますが...

docker compose logs --sinceのタイムゾーンはデフォルトだとDockerホスト側のままが利用される

なかなかの衝撃だったのだが、

docs.docker.com

Description

The --since option shows only the container logs generated after a given date. You can specify the date as an RFC 3339 date, a UNIX timestamp, or a Go duration string (e.g. 1m30s3h). Besides RFC3339 date format you may also use RFC3339Nano, 2006-01-02T15:04:052006-01-02T15:04:05.9999999992006-01-02T07:00, and 2006-01-02

https://docs.docker.com/reference/cli/docker/container/logs/

The local timezone on the client will be used if you do not provide either a Z or a +-00:00 timezone offset at the end of the timestamp. When providing Unix timestamps enter seconds[.nanoseconds], where seconds is the number of seconds that have elapsed since January 1, 1970 (midnight UTC/GMT), not counting leap seconds (aka Unix epoch or Unix time), and the optional .nanoseconds field is a fraction of a second no more than nine digits long. You can combine the --since option with either or both of the --follow or --tail options.

https://docs.docker.com/reference/cli/docker/container/logs/

⇧ とあり、Dockerコンテナ側のログの範囲を指定したいのに、デフォルトだとDockerホスト側の日時が指定されてしまいますと…

これは、Docker Compose環境ではない、通常のDockerの方もで同様らしく、

docs.docker.jp

補足説明

--since オプションは指定した日時以降のログを表示します。指定できる日付は RFC 3339 date、UNIX タイムスタンプ、Go 言語の期間文字(例: 1m30s 、 3h )です。Docker はクライアント側のマシン上からの相対時間を計算します。日付形式のタイムスタンプがサポートしているのは、RFC3339Nano 、 RFC3339 、 2006-01-02T15:04:05 、 2006-01-02T15:04:05.999999999 、 2006-01-02Z07:00 、 2006-01-02 です。タイムスタンプの最後にタイムゾーンオフセットとして Z か +-00:00 が指定されなければ、デーモンはローカルのタイムゾーンを使います。Unix タイムスタンプを 秒[.ナノ秒] で指定すると、秒数は 1970 年 1 月 1 日(UTC/GMT 零時)からの経過時間ですが、うるう秒(別名 Unix epoch や Unix time)を含みません。また、オプションで、9桁以上 .ナノ秒 フィールドは省略されます。 --since オプションは --follow と --tail と同時に使えます。

https://docs.docker.jp/v20.10/engine/reference/commandline/logs.html

⇧ 上記の通りらしい。

2025年7月15日(火)追記:↓ ここから

ちなみに、「--since」オプションで指定した該当する日時の範囲のログが出力されていない場合、ログは取得できないことになるっぽい。

つまり、0行となるようだ。

2025年7月15日(火)追記:↑ ここまで

まぁ、説明が分かり辛いのだが、デフォルトだとDockerホスト側の日時が指定されるので、何も考えずに日時を指定すると困ったことが起きる。

つまり、Dockerホスト側とDockerコンテナ側で「タイムゾーン(TZ:TimeZone)」が異なる場合に期待通りに動作しないことになりますと。

例えば、

No 環境 タイムゾーン(TZ:TimeZone)
1 Dockerホスト JST
2 Dockerコンテナ UTC

⇧ 上記のように「タイムゾーン(TZ:TimeZone)」が異なった場合に、「--since」に指定する日時を「タイムゾーン(TZ:TimeZone)」が「JST」のものにしてしまうと期待通りに動作しなくなるわけだ。

どうすれば良いかというと、

unix.stackexchange.com

⇧ 上記サイト様によりますと、一時的にであれば「date」コマンドの「--utc」オプションを利用するしか無さそう。

勿論、Dockerホスト側の「タイムゾーン(TZ:TimeZone)」が「UTC」以外で、Dockerコンテナ側の「タイムゾーン(TZ:TimeZone)」が「UTC」である前提なのだが...

日時の計算とか発生する場合は更に面倒なことになりそう...

とりあえず、

stackoverflow.com

⇧ 上記サイト様を参考に試してみた。

「WSL 2(Windows Subsystem for Linux 2)」の「Ubuntu 24.04 LTS」で試してみる。

UTCで10分前、現在、10分後の日時を出力

date -u --date='10 minutes ago'; date -u; date -u --date='10 minutes'    

■デフォルトで10分前、現在、10分後の日時を出力

date --date='10 minutes ago'; date; date --date='10 minutes'   

⇧ といった感じで、「タイムゾーン(TZ:TimeZone)」の切り替え、且つ、時間の計算も出来てるっぽい。

ちなみに、「Phind」に、

  1. optionとvalueをequalで連結する方法
  2. optionとvalueを半角スペースで連結する方法

について質問してみたところ、以下のような回答が返ってきた。

bash」では、どちらもサポートしてるっぽいが、「1. optionとvalueをequalで連結する方法」については、POSIXに準拠していないらしい。

まぁ、

  1. Dockerホスト
  2. Dockerコンテナ

で「タイムゾーン(TZ:TimeZone)」バラバラなのが問題と言えば問題なのだが...

タイムゾーン(TZ:TimeZone)」は厄介極まりないですな...

毎度モヤモヤ感が半端ない…

今回はこのへんで。