修改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安装