Docker镜像时区设置
文章目录
alpine系统时区设置
我们先使用docker run -it --name alpine_test --rm alpine:3.9 sh
命令启动一个alpine系统。
查看系统时间:
|
|
看到默认时间为UTC时间,比北京时间晚8个小时。
先安装**tzdata*包:
|
|
然后有下面2种方式设置时区:
- 设置
TZ
环境变量
|
|
注意,这种方式只对当前终端有效。可以使用docker exec进行检查。
- 修改本地时间
|
|
从nginx-alpine镜像的dockerfile也可以看到这种处理方式:
|
|
alpine镜像扩展
既然知道如何设置alpine系统时间,我们可以这样编写镜像文件dockerfile
:
|
|
然后编译镜像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:
|
|
应用程序时间示例
我们选择go语言实现:gotime.go
,代码如下:
|
|
使用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到容器中,校验:
|
|
从结果看,应用程序获取到正确时间。
插句题外话,go适合云计算的特性在这里完美展现出来。其它语言比如python,只能够换成python:3.7-alpine这样的镜像,而go可以独立运行,编译后copy到alpine镜像即可运行,所以镜像会非常小。
最后我们可以得到下面结论:
安装了tzdata
包的docker镜像,都可以使用环境变量TZ=Asia/Shanghai
方式调整时区。
最后,欢迎加下面的微信和我互动交流,一起进阶:
文章作者 shawn
上次更新 2019-03-17