alpine 鏡像時區調為 Asia/Shanghai 后因 TZ 與 apk del tzdata 導致不生效


現象:

設置 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

解決方案

  1. 不刪除 tzdata
FROM alpine AS runtime
ENV TZ Asia/Shanghai
RUN apk add tzdata && cp /usr/share/zoneinfo/${TZ} /etc/localtime \
    && echo ${TZ} > /etc/timezone
  1. 不設置 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
  1. 用官方腳本設置(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/,就不會有這個問題。

相關鏈接

https://github.com/gliderlabs/docker-alpine/issues/136


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM