Docker鏡像時區設置

alpine系統時區設置

咱們先使用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

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

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

  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也能夠看到這種處理方式:bash

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

alpine鏡像擴展

既然知道如何設置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方式調整時區。

相關文章
相關標籤/搜索