Docker時區設置方案

大部分 Docker 鏡像都是基於 Alpine,Ubuntu,Debian,CentOS 等基礎鏡像製作而成, 採用 UTC 時間,默認時區爲零時區。 而我們主要用的是 CST 時間,北京時間,位於東八區。時區代號: Asia/Shanghai。

設置時間有三種方案。

一、運行 Docker 容器時調整時區

在 Linux 系統中,控制時區和時間的主要是兩個地方:

  • /etc/timezone 主要代表當前時區設置,一般鏈接指向/usr/share/zoneinfo目錄下的具體時區。
  • /etc/localtime 主要代表當前時區設置下的本地時間。

1. 通用 docker 時區修改方案

宿主機爲 Linux 系統

當宿主機爲 Linux 系統時,我們可以直接將宿主機上的/etc/timezone/etc/localtime掛載到容器中,這樣可以保持容器和宿主機時區和時間一致。

-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

2. 通過傳遞環境變量改變容器時區

  • 適用於基於 Debian 基礎鏡像, CentOS 基礎鏡像 製作的 Docker 鏡像
  • 不適用於基於 Alpine 基礎鏡像, Ubuntu 基礎鏡像 製作的 Docker 鏡像

對於基於 Debian 基礎鏡像,CentOS 基礎鏡像製作的 Docker 鏡像,在運行 Docker 容器時,傳遞環境變量-e TZ=Asia/Shanghai進去,能修改 docker 容器時區。

-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 鏡像時調整時區

通過編寫 Dockerfile,構建自己的 Docker 鏡像,可以永久解決時區問題。

1. Alpine

根據《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

2. Debian

Debian 基礎鏡像 中已經安裝了 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/*

3. Ubuntu

Ubuntu 基礎鏡像中沒有安裝了 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/*

4. CentOS

CentOS 基礎鏡像 中已經安裝了 tzdata 包,我們可以將以下代碼添加到 Dockerfile 中。

ENV TZ Asia/Shanghai

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

總結

時區問題是大問題。

時間沒統一好,業務會亂套。

希望通過上面的內容,能夠幫助大家解決好 Docker 方面的時區問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章