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一起成长~

相关推荐
liang89991 小时前
Anconda常用命令
linux·人工智能·conda
无足鸟ICT1 小时前
【RHCA+】管道符
linux·运维·服务器
老约家的可汗1 小时前
Linux的库制作和原理
linux·运维·服务器
非鱼䲆鱻䲜2 小时前
CCS 20.5.0的printf重定向串口怎么实现?
linux·单片机·电赛·ccs
左手厨刀右手茼蒿2 小时前
PCIe设备驱动开发:从枚举到DMA传输的完整链路
linux·嵌入式·系统内核
济6172 小时前
I.MX6U Linux 驱动开发篇---零基础必看!中断实验(按键中断 + 定时器消抖 + 设备树配置实战教程)--- Ubuntu20.04
linux·驱动开发·嵌入式·嵌入式linux驱动开发
seven_stars_2 小时前
CVE-2018-19518PHP漏洞
linux·浏览器·kali
浅止菌3 小时前
嵌入式设备ping不通?tcpdump 5分钟找到凶手,比加printf快10倍
linux
Amonter3 小时前
TB-RK3399Pro移植ubuntu 26.04及烧录
linux·ubuntu·rockchip·rk3399pro
巴啦啦小魔仙变身3 小时前
SIGINT = Signal Interrupte
linux·服务器·python