在Alpine的Docker镜像上进行golang的时区转换时,发现了JST被转换为+0000 +0000的问题,并进行了调查
首先
因为遇到了一个有点小众但很棘手的错误,所以我想这是否能对开源软件有所贡献呢?于是我将进行调查并整理记录。
事件
-
- alpineのdocker image上で動作するgolangの時刻を変換する処理で、 2020-11-08 00:04:05 +0900 JST のようにJSTのタイムゾーンで変換されるはずの時刻が 2020-11-07 15:04:05 +0000 +0000となる
golang: 1.12.4でbuild
alpine: latest (2020年10月末時点)→3.20?
tzdata: latest (2020年10月末時点)→tzdata2020d-r0?
其他事实包括以下内容。
-
- 10月半ば頃までは動作していた
-
- zoneinfoを差し替えるとうまく動作する
- ちょうど10月25日にalpineのtzdataがアップデートされていた (alpine tzdata, commitより)
验证
由于在验证时无法使用tzdata2020d,因此我们只能进行tzdata2020c-r0的验证,并得出以下结论。
golang1.12でビルドしたバイナリで、alpine && tzdata2020c-r0, tzdata2020d-r0を使うとJSTの変換ができない という結果になりました。
使用alpine_tzdata_investigation作为调查库,通过使用Docker检查一些版本组合。那些没有在Dockerfile中指定版本的情况下,我们在注释中记录了确认方法。
go versiondocker imagetzdataresultnotego 1.12alpine 3.12.1tzdata 2020c-r0failureversionはdockerhubおよびalpine packageで確認go 1.12alpine 3.10.3tzdata 2020c-r0failure
go 1.12alpine edgetzdata 2020d-r0failure
go 1.12alpine 3.8tzdata 2020a-r0success2020aを使用しているのがalpine 8までだったためgolang 1.12ubuntu 20.04tzdata 2020d-0ubuntu0.20.04successversionはdockerhubおよびUbuntu packagesで確認golang 1.15.4(alpine)alpha 3.12.1tzdata 2020c-r0successgolang versionは[golang dockerhub]で確認golang 1.13alpine 3.12.1tzdata 2020c-r0success
go 1.12alpine edgetzdata 2020d-r0failure
go 1.12alpine 3.8tzdata 2020a-r0success2020aを使用しているのがalpine 8までだったためgolang 1.12ubuntu 20.04tzdata 2020d-0ubuntu0.20.04successversionはdockerhubおよびUbuntu packagesで確認golang 1.15.4(alpine)alpha 3.12.1tzdata 2020c-r0successgolang versionは[golang dockerhub]で確認golang 1.13alpine 3.12.1tzdata 2020c-r0success
结果,
– 如果在go 1.12、ubuntu或alpine以及tzdata2020a的情况下,也能通过。
– 如果在alpine和tzdata2020c-r0、tzdata2020d-r0中并且使用golang 1.13或更高版本,也能通过。
我明白了。
处理
- 如果不想改变go或alpine的版本,可以尝试替换tzdata(示例方法)。