docker 時(shí)區(qū)調(diào)整

對(duì)于經(jīng)常使用 Docker 的人來(lái)說(shuō),可能會(huì)碰到一個(gè)問(wèn)題:時(shí)區(qū)問(wèn)題。

大部分 Docker 鏡像都是基于 Alpine,Ubuntu,Debian,CentOS 等基礎(chǔ)鏡像制作而成。

基本上都采用 UTC 時(shí)間,默認(rèn)時(shí)區(qū)為零時(shí)區(qū)。

docker run --name test --rm -ti alpine /bin/sh
# date
Fri Nov 29 08:14:49 UTC 2019

而我們主要用的是 CST 時(shí)間,北京時(shí)間,位于東八區(qū)。時(shí)區(qū)代號(hào): Asia/Shanghai

docker run --name test --rm -ti -v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro alpine /bin/sh
# date
Fri Nov 29 16:13:55 CST 201

對(duì)比一下,我們會(huì)發(fā)現(xiàn),時(shí)間上相差 8 小時(shí)。

經(jīng)過(guò)一系列探索實(shí)踐,我們總結(jié)了一些 Docker 時(shí)區(qū)調(diào)整方案。

一、運(yùn)行 Docker 容器時(shí)調(diào)整時(shí)區(qū)

在 Linux 系統(tǒng)中,控制時(shí)區(qū)和時(shí)間的主要是兩個(gè)地方:

/etc/timezone 主要代表當(dāng)前時(shí)區(qū)設(shè)置,一般鏈接指向/usr/share/zoneinfo目錄下的具體時(shí)區(qū)。
/etc/localtime 主要代表當(dāng)前時(shí)區(qū)設(shè)置下的本地時(shí)間。

    1. 通用 docker 時(shí)區(qū)修改方案
      宿主機(jī)為 Linux 系統(tǒng)
      當(dāng)宿主機(jī)為 Linux 系統(tǒng)時(shí),我們可以直接將宿主機(jī)上的/etc/timezone和/etc/localtime掛載到容器中,這樣可以保持容器和宿主機(jī)時(shí)區(qū)和時(shí)間一致。
 -v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro

使用示例如下:

docker run --name test --rm -ti -v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro alpine /bin/sh
# date
Fri Nov 29 16:13:55 CST 2019
    1. 通過(guò)傳遞環(huán)境變量改變?nèi)萜鲿r(shí)區(qū)
      適用于基于 Debian 基礎(chǔ)鏡像, CentOS 基礎(chǔ)鏡像 制作的 Docker 鏡像
      不適用于基于 Alpine 基礎(chǔ)鏡像, Ubuntu 基礎(chǔ)鏡像 制作的 Docker 鏡像
      對(duì)于基于 Debian 基礎(chǔ)鏡像,CentOS 基礎(chǔ)鏡像制作的 Docker 鏡像,在運(yùn)行 Docker 容器時(shí),傳遞環(huán)境變量-e TZ=Asia/Shanghai進(jìn)去,能修改 docker 容器時(shí)區(qū)。
-e TZ=Asia/Shanghai

使用示例如下:

docker run --name test -e TZ=Asia/Shanghai --rm -ti debian /bin/bash
# date
Fri Nov 29 18:46:18 CST 2019

二、制作 Docker 鏡像時(shí)調(diào)整時(shí)區(qū)

通過(guò)編寫(xiě) Dockerfile,構(gòu)建自己的 Docker 鏡像,可以永久解決時(shí)區(qū)問(wèn)題。

    1. Alpine
      根據(jù)《Setting the timezone》提示,我們可以將以下代碼添加到 Dockerfile 中:
ENV TZ Asia/Shanghai

RUN apk add tzdata && cp /usr/share/zoneinfo/${TZ} /etc/localtime \
    && echo ${TZ} > /etc/timezone \
    && apk del tzdata
    1. Debian

Debian 基礎(chǔ)鏡像 中已經(jīng)安裝了 tzdata 包,我們可以將以下代碼添加到 Dockerfile 中:

ENV TZ=Asia/Shanghai \
    DEBIAN_FRONTEND=noninteractive

RUN ln -fs /usr/share/zoneinfo/${TZ} /etc/localtime \
    && echo ${TZ} > /etc/timezone \
    && dpkg-reconfigure --frontend noninteractive tzdata \
    && rm -rf /var/lib/apt/lists/*
    1. Ubuntu

Ubuntu 基礎(chǔ)鏡像中沒(méi)有安裝了 tzdata 包,因此我們需要先安裝 tzdata 包。

我們可以將以下代碼添加到 Dockerfile 中。

ENV TZ=Asia/Shanghai \
    DEBIAN_FRONTEND=noninteractive

RUN apt update \
    && apt install -y tzdata \
    && ln -fs /usr/share/zoneinfo/${TZ} /etc/localtime \
    && echo ${TZ} > /etc/timezone \
    && dpkg-reconfigure --frontend noninteractive tzdata \
    && rm -rf /var/lib/apt/lists/*
    1. CentOS
      CentOS 基礎(chǔ)鏡像 中已經(jīng)安裝了 tzdata 包,我們可以將以下代碼添加到 Dockerfile 中。
ENV TZ Asia/Shanghai

RUN ln -fs /usr/share/zoneinfo/${TZ} /etc/localtime \
    && echo ${TZ} > /etc/timezone

總結(jié)
時(shí)區(qū)問(wèn)題是大問(wèn)題。

時(shí)間沒(méi)統(tǒng)一好,業(yè)務(wù)會(huì)亂套。

希望通過(guò)上面的內(nèi)容,能夠幫助大家解決好 Docker 方面的時(shí)區(qū)問(wèn)題。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容