1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

記事投稿キャンペーン 「2024年!初アウトプットをしよう」

Docker + GolangでTimeZoneがうまく設定できない

Posted at

はじめに

どうも僕です。

業務でDockerを使うことがあるのですが、golangのコンテナでcronの実行をする際、タイムゾーンがUTCだったのでJSTに変えようとしたところ、結構つまづいたのでメモっておきます。

概要

golangにてcronを使って毎日特定の時刻に関数を走らせたい!

しかしタイムゾーンがUTCだ!!

どうにかせんといかん。

結論

先に結論を言うと、 Dockerfileに次のコードを追加する。

FROM golang:1.19

WORKDIR /usr/src
# これを追加↓
ADD https://github.com/golang/go/raw/master/lib/time/zoneinfo.zip /usr/local/go/lib/time/zoneinfo.zip

そしてコード

sample.go
package main

import (
	"fmt"
	"log"
	"os"
	"time"
)

func main() {
	os.Setenv("TZ", "Asia/Tokyo")
	log.Println("Now time is: ", time.Now())
	local, err := time.LoadLocation("Local")
    if err != nil {
		log.Println(err)
	}
	fmt.Println(local)
}
結果
root@c74f69be4f71:/usr/src# go run main.go
2024/01/19 12:29:18 Now time is:  2024-01-19 12:29:18.482109833 +0900 JST m=+0.000930959
Local is:  Asia/Tokyo

解説

DockerのTimeZoneに関しては色々な設定があると思います。
設定の際にやってみたこととしては

  • ホストOSのTimezoneをJSTにしてVolumeでDockerに渡す
  • DockerfileにTZ:Asia/Japanを入れた
  • Dockerコンテナ内でdateコマンドからJSTなるようにした
  • DockerfileでCOPY --from=builder /usr/share/zoneinfo/Asia/Tokyo /usr/share/zoneinfo/Asia/Tokyoをしてみた

等々、いろいろありますが、問題点がいくつかあるようです。


ホストOSのTimezoneをJSTにしてVolumeでDockerに渡す
Dockerコンテナ内でdateコマンドからJSTなるようにした

あまり推奨されてなさそう

$ docker compose exec golang bash

# コンテナに入る
$ date
Fri Jan 19 12:45:47 JST 2024

こうなってもgolangがTimezoneを参照しに行く場所が違うため意味がない


DockerfileにTZ:Asia/Japanを入れた

TZが対応していないDocker Imageもあるから必ずできるわけではない


DockerfileでCOPY --from=builder /usr/share/zoneinfo/Asia/Tokyo /usr/share/zoneinfo/Asia/Tokyoをしてみた

DockerImageがalpineのような軽量のものでは/usr/share/zoneinfoが存在せず、
docker compose buildの際にエラーが出る


結論2

Dockerfileに
ADD https://github.com/golang/go/raw/master/lib/time/zoneinfo.zip /usr/local/go/lib/time/zoneinfo.zip
を追加してgolangがTimezoneを参照できるところにTimezoneの情報を置いて、os.Setenv("TZ", "Asia/Tokyo")
すればいい。

参考になったリンク

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?