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種方式設定時區:
- 設定
TZ
環境變數
export TZ="Asia/Shanghai"
# echo $TZ
Asia/Shanghai
# date
Mon Mar 11 18:48:30 CST 2019
複製程式碼
注意,這種方式只對當前終端有效。可以使用docker exec進行檢查。
- 修改本地時間
# 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
方式調整時區。