Contents

Docker時間同步(校正)

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

參考資料