Docker镜像时区设置

344次阅读  |  发布于3年以前

alpine系统时区设置

我们先使用 docker run-it--name alpine_test--rm alpine:3.9sh命令启动一个alpine系统。

查看系统时间:

# echo $TZ

# date
Mon Mar 11 10:47:20 UTC 2019

看到默认时间为UTC时间,比北京时间晚8个小时。

先安装*tzdata包:

export TZ="Asia/Shanghai"
# echo $TZ
Asia/Shanghai
# date
Mon Mar 11 18:48:30 CST 2019

然后有下面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.-fDockerfile-t alpine-ext:0.0.1

使用 docker run-it--rm-e TZ=Asia/Shanghaialpine-ext:0.0.1sh命令,然后执行 date结果为 MonMar1120:11:16CST2019;使用 docker run-it--rm-e TZ=Asia/Bangkokalpine-ext:0.0.1sh命令,然后执行 date结果为 MonMar1119:12:16+072019。曼谷时间比北京时间晚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.1sh命令启动容器。然后通过 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包的Alpine镜像(其它Docker镜像都可以参照)可以使用环境变量 TZ=Asia/Shanghai方式调整时区。

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8