Docker镜像时区设置

简介: Docker镜像时区设置

image.png


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种方式设置时区:


  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 . -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方式调整时区。

目录
相关文章
|
8月前
|
JavaScript Docker 容器
使用Docker多阶段构建优化镜像大小
使用Docker多阶段构建优化镜像大小
529 100
|
8月前
|
缓存 安全 Linux
优化Docker镜像大小的多阶段构建实践
优化Docker镜像大小的多阶段构建实践
518 99
|
8月前
|
缓存 Docker 容器
优化Docker镜像大小的五个实用技巧
优化Docker镜像大小的五个实用技巧
787 98
|
8月前
|
安全 Go Docker
使用Docker多阶段构建优化镜像大小
使用Docker多阶段构建优化镜像大小
|
7月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
820 6
|
8月前
|
Java Docker 容器
使用Docker多阶段构建优化镜像大小
使用Docker多阶段构建优化镜像大小
350 8
|
9月前
|
缓存 Ubuntu Docker
Ubuntu环境下删除Docker镜像与容器、配置静态IP地址教程。
如果遇见问题或者想回滚改动, 可以重启系统.
568 16