DockerのAlpine Linuxでタイムゾーンでハマった
おはようございます。奥さんが毎年恒例の海外出張で子供達と実家に来てます。この間、次男が夏風邪で結構高熱になったり平熱近くになったりしてましたが、さすがに一週間近く経ち、次男もすっかり回復しました。@kjunichiです。
- 作者: Adrian Mouat,Sky株式会社玉川竜司
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/08/17
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
背景
herokuからnode.jsの脆弱性出たからバージョン挙げてねーっとメールが来た。 無料枠でお世話になっているの、放置してアカウント凍結されたらシャレにならないので、早速対応。
DockerベースでNode.jsを使ったSlackボットがこの中に含まれ、これのNode.jsのバージョンも 上げようとしたら、アメッシュの画像を表示する機能がうまく動作しないことが分かった。
アメッシュの雨の表示がおかしい
デバッグ文をいれて、JSTな時刻でnode.jsが処理されていないことが判明。
タイムゾーンを設定する
いままで、もしかすると、Slackの自作ボットは9時間前の雨の様子を表示してたのかも(爆
まぁ、そこは今回のNode.jsのアップグレード対応で問題点が分かったので良しとして進もうw。
なんかうまく行かない
早速Alpine Linuxでのタイムゾーンの設定を探すと、tzdataを一旦インストールしてその後に、
cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
して、コピーした後に、tzdataを削除する
というのがDockerなAlpine Linuxでの設定方法のようだった。
直接コンソールに入ってdateコマンドを実行してもGMTで表示される!
解決
どうやらTZを設定してるとtzdataパッケージを消してはダメらしい
RUN apk --update add tzdata && \ rm -rf /var/cache/apk/* ENV TZ Asia/Tokyo
まとめ
環境変数TZが設定されてされていると/etc/localtimeを参照しない。 tzdataパッケージが必要なので、消してはダメ
まぁ、unset TZしてtzdata消すのがイメージサイズ節約になるからこっちの方が 場合によってはいいだろうが、今後タイムゾーンの実験するかもなので残しておいた。
Node.jsのv8系に一気にあげても、expressからSlackのボットまで問題なく動いてそう。
以前書いた記事
アメッシュの画像を表示するslackのボットをbotkitを使ってDockerイメージにしてherokuで動かした - non vorrei lavorare
を見直すと、タイムゾーンの対応してあるが、どうもこの後、HerokuでのDockerコンテナの扱いが変更され、この記事当時の様なHeroku向けの コンテナを作る必要が無くなり、普通にコンテナ作ってデプロイできるようなっり、これに対応したつもりだったが、今回のタイムゾーン問題に 遭遇した模様。
参考資料
関連記事
- アメッシュの画像を表示するslackのボットをbotkitを使ってDockerイメージにしてherokuで動かした
- ackをTLで見かけ、agを知り、grep -nを理解した件
- なぜ、waitpidをループ処理させるのか
- 過去7月にブログ記事が無かった日を挙げる
ハマったつながり
1年後の記事
分散システムデザインパターン ―コンテナを使ったスケーラブルなサービスの設計
- 作者: Brendan Burns,松浦隼人
- 出版社/メーカー: オライリージャパン
- 発売日: 2019/04/20
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る