Posted at

Dockerコンテナ上で起動したアプリケーションで時間がおかしい


はじめに

どうも@chan_kakuです

今回は社内ツールをDocker化した際に問題が発生したので、その問題と今回打った対策、そして苦労した点など紹介していきます。


問題

今回はJavaのアプリケーションで問題が発生しました。

その問題というのは、とある箇所で、DBにて永続化させる時間をnew Date()で現在時間をとって永続化させるような処理でした。

今までは、Dockerを使っておらず、ホストサーバのタイムゾーンに依存してましたので、JSTで時間が取れており、何も問題がありませんでした。

しかしながら、このツールをDocker化した後にこのnew Date()での現在時間がずれるというような問題が発生してしまいました。


原因と推測

そもそも自分はDockerについての知識があまりなく、Java側のコードに問題があると推測していました。

しかしながら、上記にあるように、現在時刻をnew Date()でとっていたため、その推測は外れてしまいました。

次の推測としては、ホストサーバのタイムゾーンでした。しかしながら、dateコマンドを打つと、JSTと表示されたため、こちらも外れました。

僕の考えられる推測が尽きてしまったため、Dockerに詳しい方々に聞いたところ、どうやらDocker内にも時間があるらしく、こちらの時間がずれているのではないかという情報を得ました。

そこで、以下のコマンドでDocker内に入り、同じようにDockerコンテナ内のタイムゾーンを調べました

docker run -t -i (対象のdocker image)  /bin/bash → docker起動して中に入る

# date

ここでは先ほどと同じようにJSTとなっておりました。


対策

もはや、ここで万策尽きたと嘆いていたところ、とある方から鶴の一声が、、、

「Docker内で/etc/timezone の中身見てみて〜」

この方を信じ、Docker内に入り、/etc/timezone をみてみたところ、ここがUTC となっていました

もしやということでDockerfileで /etc/timezoneAsia/Tokyoになるように以下のように修正しました

ENV TZ="Asia/Tokyo"

RUN echo $TZ > /etc/timezone

// timezone関連以外の記載は省略

今回あえてechoで変えた理由としては、ツールの要件的に時間系のタイムゾーンはJSTであることが求められていたので、ここはDockerfileに記載すべきだと判断しました


終わりに

Dockerについての知識があまりなかったためにいろんなところで苦労はしましたが、ひとまず解決して良かったです!

もっとこうした方がスマートだよなどのマサカリをお待ちしております