Docker 容器时区不对,`timedatectl` 不存在怎么办?

Docker 封装出来的系统,经常会遇到时区不对的问题。新建容器时,有些环境可以直接通过 docker run 增加参数解决:

bash 复制代码
-e 'TZ=Asia/Shanghai'

但如果容器已经在本地修正和使用过很多次,不适合删除后重新 run,那就需要在现有容器里直接处理。

01 | 为什么 timedatectl 会失败?

笔者进入容器后,尝试按常规方式修改时区:

bash 复制代码
timedatectl set-timezone Asia/Shanghai

结果直接报错:

bash 复制代码
bash: timedatectl: command not found

当前环境信息如下:

bash 复制代码
uname -a
bash 复制代码
Linux ora26ai 5.15.0-316.196.4.2.el8uek.x86_64 #2 SMP Thu Feb 5 10:42:53 PST 2026 x86_64 GNU/Linux

这是因为 Docker 容器内,尤其是基于 Oracle Linux / RedHat 的最小化镜像,为了精简体积,通常没有安装 systemd。所以 timedatectl 这个命令不存在,也就不能用它来改时区。

02 | 直接修改 /etc/localtime

在容器中修改时区,最直接有效的方式,是修改本地时区文件或软链接。

如果容器内已经存在时区数据库,比如 /usr/share/zoneinfo/Asia/Shanghai,可以在容器 root 权限下执行:

bash 复制代码
rm -f /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
date

前两行命令会删除原有本地时区配置,并把上海时区链接到 /etc/localtime。最后用 date 验证时间是否已经变成 CST,也就是中国标准时间。

03 | 如果没有 Asia/Shanghai 文件怎么办?

有些 Docker 环境里,执行上面的方法会发现缺少:

bash 复制代码
/usr/share/zoneinfo/Asia/Shanghai

这时只复制宿主机的 /etc/localtime 可能还不够,因为容器内本质上缺少对应的时区数据库文件。

可以从宿主机复制上海时区文件到容器内。假设容器名是 vis-server,先创建目录:

bash 复制代码
docker exec -it vis-server mkdir -p /usr/share/zoneinfo/Asia

再把宿主机的时区文件复制进去:

bash 复制代码
docker cp /usr/share/zoneinfo/Asia/Shanghai vis-server:/usr/share/zoneinfo/Asia/Shanghai

之后再进入容器,重新执行:

bash 复制代码
rm -f /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
date

这样就可以在不重建容器的情况下,把 Docker 容器时间对齐到北京/上海时间。

关注我,和AI一起成长~

相关推荐
顶点多余5 小时前
9.18 面试题总结 --- 绿盟
linux·面试
挖掘狂人5 小时前
当生产环境"变慢",我用这套 perf + strace 30 分钟定位瓶颈
linux·运维·性能优化
傲世仙尊7 小时前
IO流起步-从fopen到文件描述符fd
linux
Rabitebla7 小时前
【Linux系统编程】 指令(二):一条路径是怎么定位到文件的
linux·c++·笔记·学习·算法
人工智能培训7 小时前
大语言模型:从语言理解到通用智能的跃迁
linux·服务器·前端·人工智能
顶点多余7 小时前
9.20 知识点查漏补缺
linux·面试·职场和发展
阿明67 小时前
Linux进程【Linux】
linux·运维·服务器
Android系统攻城狮8 小时前
Linux Gstreamer深度解析之gst_audio_resampler_update调用流程与实战(三十)
linux·运维·服务器·gstreamer音视频·音视频进阶
qetfw8 小时前
Linux tcpdump 抓包实战:网卡、主机、端口过滤与 PCAP 分析
linux·tcpdump
pilifeng18 小时前
Ubuntu Linux 目录结构详解
linux·ubuntu