Problem entry · machine-readable · 编码代理与终端

容器里时间差 8 小时(date 显示 UTC)/ 中文乱码(UnicodeEncodeError)

本页嵌入 #trove-entity JSON(本条目全量结构化数据);全库数据见 /agent/trove.json。

元数据

iddocker-container-timezone-locale收录2026-08-31
问题域编码代理与终端主题分组容器与 WSL
适用工具docker · 外部工具

症状

```

# 时区

$ docker run --rm -e TZ=Asia/Shanghai alpine date

Mon Aug 31 15:09:18 UTC 2026 # 还是 UTC!

$ docker run --rm alpine ls /usr/share/zoneinfo

ls: /usr/share/zoneinfo: No such file or directory

# 乱码

$ docker run --rm -e PYTHONIOENCODING=ascii python:3.12-alpine python3 -c "print('中文测试')"

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)

```

特征:`TZ=Asia/Shanghai` 设了但 date 仍 UTC;镜像缺 zoneinfo;程序输出中文抛 ascii 编码错误。

原因

容器默认 UTC 且不继承宿主机时区;alpine 等基础镜像缺 `/usr/share/zoneinfo`,`TZ=Asia/Shanghai` 无效。中文乱码=容器内程序被锁成 ASCII/非 UTF-8 输出(UnicodeEncodeError),或查看终端编码与 UTF-8 不匹配(显示乱码)。

解法

1. 时区:Debian 系 `-e TZ=Asia/Shanghai`;alpine 装 tzdata 或临时 `-e TZ=UTC-8`(POSIX 符号相反);改 env 后重建容器;

2. 乱码:`PYTHONUTF8=1` / `PYTHONIOENCODING=utf-8` / `LANG=C.UTF-8`;显式 ascii 必须直接改成 utf-8;

3. 查看侧:终端切 UTF-8(`chcp 65001` 等)。

验证证据

- 本机实测复现(2026-08-31,WSL 定制预构建版,docker 29.1.3):

- 宿主机 `23:09:18 CST` vs 容器默认 `15:09:18 UTC`(差 8h);

- `-e TZ=Asia/Shanghai` alpine → 仍 UTC;`ls /usr/share/zoneinfo` → No such file;

- `-e TZ=UTC-8` alpine → `23:09:19`(与 CST 一致,POSIX 符号相反);

- python 默认 `stdout encoding: utf-8` 中文正常;`PYTHONIOENCODING=ascii` → UnicodeEncodeError 原文;`PYTHONIOENCODING=utf-8` / `PYTHONUTF8=1` → 正常;

- 环境限制:本机 alpinelinux 源异常(`apk add tzdata` 报 no such package),标准 tzdata 路径按官方文档记录,未在本机完整验证。

- 实测复现日志(2026-08-31)

来源与证据

素材来源:本机实测复现(2026-08-31,Docker 域缺口 #18)

验证证据:Evidence details kept locally (2026-08-31)