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
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
pyenvにはCONFIGURE_OPTSではなくPYTHON_CONFIGURE_OPTSだった件
こんにちは。しばらく、奥さんが海外出張で不在の為、実家に子供達と来ている@kjunichiです。
前回の記事
ではpyenvで2.7.13は--enable-frameworkを指定するとビルドできませんでした。
しかし!
またまた、Qiita経由で id:antimon2_math さんにコメント頂き、解決しました。
CONFIGURE_OPTSではなく、PYTHON_CONFIGURE_OPTSに--enable-frameworkを指定することで、 無事2.7.13でもframework形式でビルド出来ました。感謝!
まとめ
思い込みよくない、ドキュメントをよく確認しましょう。。 PyCall.jlのREADMEを改めて見返すとPYTHON_CONFIGURE_OPTSと記載されてました。
- 作者: Bill Lubanovic,斎藤康毅,長尾高弘
- 出版社/メーカー: オライリージャパン
- 発売日: 2015/12/01
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (3件) を見る
退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング
- 作者: Al Sweigart,相川愛三
- 出版社/メーカー: オライリージャパン
- 発売日: 2017/06/03
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (6件) を見る
Pythonによるデータ分析入門 第2版 ―NumPy、pandasを使ったデータ処理
- 作者: Wes McKinney,瀬戸山雅人,小林儀匡,滝口開資
- 出版社/メーカー: オライリージャパン
- 発売日: 2018/07/26
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
関連記事
10年前の記事
5年前の記事
1年前の記事
1年後の記事
PYTHONビルド時の--enable-frameworkと--enable-sharedの違い
こんにちは、長男が今年もお泊まり保育でした。去年やって今年は2回目なので、こちらも去年ほどは心配せずのんびり過ごせるはずが、仕事に追われて、家路につく頃には長男はいつもは家では起きてる時間ですが、お泊まり保育の就寝時刻を過ぎていました@kjunichiです。
背景
Qiitaに
macOSでpyenvで入れたpythonをPyCallで使うには - Qiita
なる記事を投稿して、最近コメント頂いた。
macOSではPythonビルド時に--enable-frameworkなるオプションがあり、 自分の投稿したUnix的発想の--enable-sharedではなく、macOSの流儀に従ったオプションがあり、PyCall.jlの公式でも こちらのオプションが提示されていることを知った。
調査
とりあえず、やってみた
--enable-framework
- /3.5.3/Python.framework
といった感じで、pythonのインストールディレクトリ直下にPython.frameworkが出来る。
lib配下のlibpythonはframework内のファイルのシンボリックリンクとして作成される。
ls -l 3.5.3/lib lrwxr-xr-x 1 junichi staff 74 Jul 7 14:24 3.5.3/lib@ -> /Users/junichi/.pyenv/versions/3.5.3/Python.framework/Versions/Current/lib
2.7系だとpyenvで--enable-framework駄目かも。。。
どうも、2.7系だと最近の版は--enable-frameworkだとダメみたいでした。 軽くWebを検索する限り、過去にもどうも--enable-frameworkは問題起こしてるみたいでした。
Creating directory /Library/Frameworks/Python.framework/Versions/2.7/Resources/English.lproj install: mkdir /Library/Frameworks/Python.framework: Permission denied Creating directory /Library/Frameworks/Python.framework/Versions/2.7/lib install: mkdir /Library/Frameworks/Python.framework: Permission denied make: *** [frameworkinstallstructure] Error 71
--enable-fwamework=/Users/foo/libpath
を指定しても、
ln -fs "../../../Python" "/Users/junichi/.pyenv/versions/2.7.13/Python.framework/Versions/2.7/lib/python2.7/config/libpython2.7.a" ln: /Users/junichi/.pyenv/versions/2.7.13/Python.framework/Versions/2.7/lib/python2.7/config/libpython2.7.a: No such file or directory make: *** [frameworkinstallmaclib] Error 1
とエラーになってしまう。
※追記
実は、これ、pyenvで指定する環境変数がCONFIGURE_OPTSだとダメで、PYTHON_CONFIGURE_OPTSであれば、2.7系でもパスの指定も不要でインストール出来ました。
--enable-shared
Python.frameworkは作られず、Unix系な共有ライブラリのみ作成された。
macmini2014:versions junichi$ ls -l 2.7.13/lib/libpython2.7.dylib -r-xr-xr-x 1 junichi staff 2049716 Jul 7 16:37 2.7.13/lib/libpython2.7.dylib*
PyCall.jlを斜め読み
Python.frameworkを直接使用するコードは見当たらなかった。
using PyCall PyCall.libpython
で、lib配下のlibpythonxx.dylibを参照していることが判明。
結論
--enable-sharedでもJuliaからは問題なさそう。 ただ、どうせ、macOSで使うんだからPython.frameworkも作っておいた方が 後から役に立つ可能性があるかも。。。
2.7系は--enable-framework出来なければ、--enable-sharedで使うしかない。
関連記事
- #trouble #python3 pygtkのインストールにはまり中
- MavericksでもOpenCVでFaceTime HDカメラが動いた
- BaiduのIMEで俄然注目のmitmproxyをインストールしたらエラー #Solved
- 2014年大注目のFridaを動かした!
- シェルスクリプトのかわりにPythonでマルチプラットフォームで動かそうとして学んだこと