修改Docker容器时区

在启动Docker时并且上生产环境的时候必须要修改容器时区,要不然你产生的数据记录时间是比北京时间晚了8个小时的,因为Docker容器内默认采用的是UTC时间,但是时间是不对的,所以要修改容器时区为北京时间,时区为 Asia/shanghai,才可以~

修改Docker容器时区的方式有三种:第一种使用Dockerfile制作镜像时配置,第二种启动单个容器时配置,第三种你的容器已经启动的情况进行修改。

第一种、使用Dockerfile制作镜像时配置时区

优点是使用该镜像启动的新容器不需要再次修改,其原理就是将宿主主机的时区文件软链到容器内并且在容器内重写时区文件。在编写Dockerfile时添加如下代码:

1
2
ENV TIMEZONE=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TIMEZONE /etc/localtime && echo $TIMEZONE > /etc/timezone

第二种、启动单个容器时配置时区

例如启动一个MYSQL容器进行挂载宿主主机本地时区,这个是参考:STACK OVERFLOW,经过测试/etc/timezone不会改变,固而这种方式不可取,你有好的想法? 说说看?

1
2
3
4
5
6
7
docker run --name mysql_tester \
--restart always \
-p 53306:3306 \
-v /etc/localtime:/etc/localtime:ro \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=hello \
-d mysql

第三种、你的容器已经启动的情况进行修改时区

这种方式,你每次启动新容器时都需要修改时区,那如果这个已经修改了时区的容器一直使用,或者说重启都没有什么问题。具体操作,首先进入到容器环境内部

1
$ docker exec -it <ContainerID/ContainerName> /bin/bash

修改容器环境内部时间,将容器默认的本地时间,进行软链覆盖

1
$ ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

指定时区,通过输出重定向的方式将容器时区改写为Asia/Shanghai

1
$ echo "Asia/Shanghai" > /etc/timezone
comments powered by Disqus