修改Docker容器中的时区的简便方法

1. 问题

在使用 Docker 创建的 Ubuntu 容器中,偶然查看新建文件的时间和宿主机系统时间差了有8个小时,

2. 解决方案

根据经验,判断是时区没有选择对,运行命令 data -R 发现,果然如此。

root@5a4f037d5c3d:~# date -R
Thu, 31 Mar 2022 01:39:49 +0000
+0000 代表就是当前系统为0时区。
由于Ubuntu容器中没有界面,不能图形化修改时区,查找资料可以使用 tzselect 命令修改时区。
执行 tzselet 如下:
root@5a4f037d5c3d:~# tzselect
/usr/bin/tzselect: line 180: /usr/share/zoneinfo/iso3166.tab: No such file or directory
/usr/bin/tzselect: time zone files are not set up correctly

看来是缺少了时区文件,那么时区文件从哪儿来呢?

再次查找资料,发现可以通过 apt install tzdata 进行安装时区,有很多时区可供选择。

但是,如果不想要使用那么多的时区怎么办呢,再次查找资料找到了一个简单的,不需要在docker中安装 tzdata 的方式。

就是直接拷贝需要的时区数据,再进行软链接就可以了。执行命令如下

# step1. 进入容器中 创建文件夹
# 注意:只有运行时候 docker run -dit 的容器才可以进入容器的shell操作
docker exec -it test bash

# 由于没有安装tzdata的系统没有这个文件夹 需要创建
# -p 因为没有zoneinfo父路径,所以需要同时创建父子路径
mkdir -p /usr/share/zoneinfo/Asia

# step2. 宿主机中拷贝时区文件到容器中
# test 是笔者测试用的容器名
# 笔者需要的东八区上海的时区文件,如果需要其他的可以相应改动
docker cp /usr/share/zoneinfo/Asia/Shanghai test:/usr/share/zoneinfo/Asia/Shanghai

# step3. 再次进入容器 执行软链接创建
docker exec -it test bash
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

# step4. 验证
root@5a4f037d5c3d:~# date -R
Thu, 31 Mar 2022 09:58:32 +0800

值得一提的是,笔者的宿主机是ubuntu系统,所以可以直接拷贝。如果是windows系统,建议从其他地方拷贝,或者 apt install tzdata --no-install-recommends 先安装,再 apt remove tzdata 卸载。

--no-install-recommends 是为了最小化安装,不安装不必要的包。

3. 参考文献

[1]. 在自动化运维中设置apt-get install tzdata的noninteractive方法_易生一世的博客-CSDN博客_tzdata安装

[2]. Docker修改容器中的时间 - battor - 博客园

posted @ 2022-03-31 10:07  缘起花渊  阅读(3335)  评论(1编辑  收藏  举报