元数据
| id | docker-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)