咱們先使用docker run -it --name alpine_test --rm alpine:3.9 sh
命令啓動一個alpine系統。python
查看系統時間:linux
# echo $TZ
# date
Mon Mar 11 10:47:20 UTC 2019
複製代碼
看到默認時間爲UTC時間,比北京時間晚8個小時。nginx
先安裝**tzdata*包:git
apk add --no-cache tzdata
複製代碼
而後有下面2種方式設置時區:github
TZ
環境變量export TZ="Asia/Shanghai"
# echo $TZ
Asia/Shanghai
# date
Mon Mar 11 18:48:30 CST 2019
複製代碼
注意,這種方式只對當前終端有效。能夠使用docker exec進行檢查。docker
# 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也能夠看到這種處理方式:bash
# Bring in tzdata so users could set the timezones through the environment
# variables
&& apk add --no-cache tzdata
複製代碼
既然知道如何設置alpine系統時間,咱們能夠這樣編寫鏡像文件dockerfile
:ui
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個時間都正確。spa
這種方式還展現了能夠在運行時指定時區。
另外若是確認代碼不存在國際化需求,也能夠直接將時區定義固定爲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
方式調整時區。