Docker 容器在建立時,預設使用的是 UTC 時間,對於台灣或其他非 UTC 時區的應用程式而言,日誌時間、資料庫時間戳記等可能會顯示不正確的時間。以下整理幾種修正 Docker 容器時間的方式。
問題確認
1
2
3
4
5
|
# 查看主機時間
date
# 查看容器時間
docker exec -it <container_name> date
|
如果兩者不一致,就需要進行時區同步設定。
方法一:掛載主機的 localtime(推薦)
將主機的 /etc/localtime 掛載到容器內,容器就會使用主機的時區設定:
1
2
3
4
|
docker run -d \
-v /etc/localtime:/etc/localtime:ro \
-v /etc/timezone:/etc/timezone:ro \
your-image-name
|
:ro 表示唯讀(read-only),避免容器意外修改主機設定。
方法二:設定 TZ 環境變數
透過設定 TZ 環境變數來指定容器的時區:
1
2
3
|
docker run -d \
-e TZ=Asia/Taipei \
your-image-name
|
或在 Dockerfile 中設定:
1
2
3
4
5
6
7
|
FROM ubuntu:20.04
ENV TZ=Asia/Taipei
RUN apt-get update && apt-get install -y tzdata \
&& ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \
&& echo $TZ > /etc/timezone
|
方法三:docker-compose.yml 設定
在 docker-compose.yml 中同時使用環境變數和 volumes 掛載:
1
2
3
4
5
6
7
8
9
|
version: '3'
services:
app:
image: your-image-name
environment:
- TZ=Asia/Taipei
volumes:
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
|
方法四:容器內執行 ntpdate 同步
如果需要與 NTP 伺服器同步時間(需要容器有網路存取權限):
1
2
3
4
5
6
7
8
|
# 進入容器
docker exec -it <container_name> bash
# 安裝 ntpdate(以 Ubuntu 為例)
apt-get install -y ntpdate
# 同步時間
ntpdate -u pool.ntp.org
|
各方法比較
| 方法 |
優點 |
缺點 |
| 掛載 localtime |
永遠與主機同步 |
依賴主機時區設定 |
| TZ 環境變數 |
彈性設定任意時區 |
需在每個容器設定 |
| Dockerfile ENV |
映像檔內建時區 |
時區固定,不易更改 |
| ntpdate |
可精確同步時間 |
需要網路,不持久 |
驗證設定
1
2
3
4
5
6
|
# 驗證容器時間已正確設定
docker exec -it <container_name> date
# 應顯示類似:
# Fri Jan 14 23:28:00 CST 2018
# CST = China Standard Time = UTC+8
|
參考資料