大部分 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 方面的時區問題。