Docker映象時區設定

遊戲不存在發表於2019-03-17

alpine系統時區設定

我們先使用docker run -it --name alpine_test --rm alpine:3.9 sh命令啟動一個alpine系統。

檢視系統時間:

# echo $TZ

# date
Mon Mar 11 10:47:20 UTC 2019
複製程式碼

看到預設時間為UTC時間,比北京時間晚8個小時。

先安裝**tzdata*包:

apk add --no-cache tzdata
複製程式碼

然後有下面2種方式設定時區:

  1. 設定TZ環境變數
export TZ="Asia/Shanghai"
# echo $TZ
Asia/Shanghai
# date
Mon Mar 11 18:48:30 CST 2019
複製程式碼

注意,這種方式只對當前終端有效。可以使用docker exec進行檢查。

  1. 修改本地時間
# date
Mon Mar 11 11:48:56 UTC 2019
# ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# date
Mon Mar 11 18:49:02 CST 2019
複製程式碼

從nginx-alpine映象的dockerfile也可以看到這種處理方式:

# Bring in tzdata so users could set the timezones through the environment
# variables
&& apk add --no-cache tzdata
複製程式碼

alpine映象擴充套件

既然知道如何設定alpine系統時間,我們可以這樣編寫映象檔案dockerfile:

FROM alpine:3.9
RUN apk add --no-cache tzdata
複製程式碼

然後編譯映象docker build . -f Dockerfile -t alpine-ext:0.0.1

使用docker run -it --rm -e TZ=Asia/Shanghai alpine-ext:0.0.1 sh命令,然後執行date結果為Mon Mar 11 20:11:16 CST 2019;使用docker run -it --rm -e TZ=Asia/Bangkok alpine-ext:0.0.1 sh命令,然後執行date結果為Mon Mar 11 19:12:16 +07 2019。曼谷時間比北京時間晚1個小時,這樣可以看到2個時間都正確。

這種方式還展示了可以在執行時指定時區。

另外如果確認程式碼不存在國際化需求,也可以直接將時區定義固定為CST:

FROM alpine
RUN apk add --no-cache tzdata \
    && ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo "Asia/Shanghai" > /etc/timezone
ENV TZ Asia/Shanghai
複製程式碼

應用程式時間示例

我們選擇go語言實現:gotime.go,程式碼如下:

package main

import (
	"fmt"
	"time"
)

func main() {
	currentTime:=time.Now()
	fmt.Printf("%12s: %s\n", "currentTime",currentTime)
	curNow:=currentTime.Local()
	fmt.Printf("%12s: %s\n", "localTime",curNow)
	name, offset := currentTime.Zone()
	fmt.Printf("%12s: %s\n","timeZone",name)
	fmt.Printf("%12s: %d\n","offset",offset)
	fmt.Printf("%12s: %s\n","UTCTime",currentTime.UTC())
	timeUnix:=currentTime.Unix()
	fmt.Printf("%12s: %d\n","unixTime",timeUnix)
}
複製程式碼

使用go build gotime.go命令得到gotime

如果是在mac上編譯,編譯命令需要調整成: GOOS=linux GOARCH=amd64 go build gotime.go,即編譯為linux 64位程式。

先使用docker run -it --rm -e TZ=Asia/Shanghai --name=alpine_test alpine-ext:0.0.1 sh命令啟動容器。然後通過docker cp go/src/gotime alpine_test:/複製gotime到容器中,校驗:

# date 
Mon Mar 11 18:12:05 CST 2019
# ./gotime 
 currentTime: 2019-03-11 18:12:19.131226991 +0800 CST m=+0.000535254
   localTime: 2019-03-11 18:12:19.131226991 +0800 CST
    timeZone: CST
      offset: 28800
     UTCTime: 2019-03-11 10:12:19.131226991 +0000 UTC
    unixTime: 1552299139
複製程式碼

從結果看,應用程式獲取到正確時間。

插句題外話,go適合雲端計算的特性在這裡完美展現出來。其它語言比如python,只能夠換成python:3.7-alpine這樣的映象,而go可以獨立執行,編譯後copy到alpine映象即可執行,所以映象會非常小。

最後我們可以得到下面結論:

安裝了tzdata包的docker映象,都可以使用環境變數TZ=Asia/Shanghai方式調整時區。

相關文章