現象:
設置 TZ 環境變量,並且最后刪除 tzdata,創建出來的鏡像運行時執行 date 后顯示日期還是 UTC 時間。
FROM alpine AS runtime
ENV TZ Asia/Shanghai
RUN apk add tzdata && cp /usr/share/zoneinfo/${TZ} /etc/localtime \
&& echo ${TZ} > /etc/timezone && apk del tzdata
解決方案
- 不刪除 tzdata
FROM alpine AS runtime
ENV TZ Asia/Shanghai
RUN apk add tzdata && cp /usr/share/zoneinfo/${TZ} /etc/localtime \
&& echo ${TZ} > /etc/timezone
- 不設置 TZ 環境變量
FROM alpine AS runtime
RUN apk add tzdata && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo Asia/Shanghai > /etc/timezone && apk del tzdata
- 用官方腳本設置(suggest)
在alpine 官方文檔 可以看到 timezone 是根據 setup-timezone 指定的,而在 alpine 鏡像上可以發現沒有這個命令,所以可以用 alpine-conf 安裝。
FROM alpine AS runtime
ENV TZ Asia/Shanghai
RUN apk add alpine-conf && \
/sbin/setup-timezone -z Asia/Shanghai && \
apk del alpine-conf
現在可以看到是 CST 時間了(又熬夜的一天)
# date
Sun Jan 16 04:44:07 CST 2022
推測
推測是 date 在有 TZ 環境變量時會去 /usr/share/zoneinfo/ 目錄下取時區信息,而我們刪掉的 tzdata 就是這個目錄,導致找不到信息就 fallback 到 UTC 時間了。沒有 TZ 時大概就直接從 /etc/timezone 取時區,再從 /etc/localtime 讀時區信息。而 alpine 本身可能沒有 TZ 指定環境變量的機制,像 debian 鏡像就自帶 /usr/share/zoneinfo/,就不會有這個問題。
