對于經(jīng)常使用 Docker 的人來說似袁,可能會碰到一個問題:時區(qū)問題存璃。
大部分 Docker 鏡像都是基于 Alpine淋叶,Ubuntu阎曹,Debian,CentOS 等基礎(chǔ)鏡像制作而成煞檩。
基本上都采用 UTC 時間处嫌,默認(rèn)時區(qū)為零時區(qū)。
docker run --name test --rm -ti alpine /bin/sh
# date
Fri Nov 29 08:14:49 UTC 2019
而我們主要用的是 CST 時間斟湃,北京時間熏迹,位于東八區(qū)。時區(qū)代號: 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
對比一下凝赛,我們會發(fā)現(xiàn)注暗,時間上相差 8 小時。
經(jīng)過一系列探索實踐墓猎,我們總結(jié)了一些 Docker 時區(qū)調(diào)整方案捆昏。
一、運行 Docker 容器時調(diào)整時區(qū)
在 Linux 系統(tǒng)中毙沾,控制時區(qū)和時間的主要是兩個地方:
/etc/timezone 主要代表當(dāng)前時區(qū)設(shè)置骗卜,一般鏈接指向/usr/share/zoneinfo目錄下的具體時區(qū)。
/etc/localtime 主要代表當(dāng)前時區(qū)設(shè)置下的本地時間搀军。
- 通用 docker 時區(qū)修改方案
宿主機為 Linux 系統(tǒng)
當(dāng)宿主機為 Linux 系統(tǒng)時膨俐,我們可以直接將宿主機上的/etc/timezone和/etc/localtime掛載到容器中,這樣可以保持容器和宿主機時區(qū)和時間一致罩句。
- 通用 docker 時區(qū)修改方案
-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
- 通過傳遞環(huán)境變量改變?nèi)萜鲿r區(qū)
適用于基于 Debian 基礎(chǔ)鏡像, CentOS 基礎(chǔ)鏡像 制作的 Docker 鏡像
不適用于基于 Alpine 基礎(chǔ)鏡像, Ubuntu 基礎(chǔ)鏡像 制作的 Docker 鏡像
對于基于 Debian 基礎(chǔ)鏡像焚刺,CentOS 基礎(chǔ)鏡像制作的 Docker 鏡像,在運行 Docker 容器時门烂,傳遞環(huán)境變量-e TZ=Asia/Shanghai進(jìn)去乳愉,能修改 docker 容器時區(qū)。
- 通過傳遞環(huán)境變量改變?nèi)萜鲿r區(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 鏡像時調(diào)整時區(qū)
通過編寫 Dockerfile,構(gòu)建自己的 Docker 鏡像蔓姚,可以永久解決時區(qū)問題。
- Alpine
根據(jù)《Setting the timezone》提示慨丐,我們可以將以下代碼添加到 Dockerfile 中:
- Alpine
ENV TZ Asia/Shanghai
RUN apk add tzdata && cp /usr/share/zoneinfo/${TZ} /etc/localtime \
&& echo ${TZ} > /etc/timezone \
&& apk del tzdata
- 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/*
- Ubuntu
Ubuntu 基礎(chǔ)鏡像中沒有安裝了 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/*
- CentOS
CentOS 基礎(chǔ)鏡像 中已經(jīng)安裝了 tzdata 包晌端,我們可以將以下代碼添加到 Dockerfile 中。
- CentOS
ENV TZ Asia/Shanghai
RUN ln -fs /usr/share/zoneinfo/${TZ} /etc/localtime \
&& echo ${TZ} > /etc/timezone
總結(jié)
時區(qū)問題是大問題恬砂。
時間沒統(tǒng)一好咧纠,業(yè)務(wù)會亂套。
希望通過上面的內(nèi)容泻骤,能夠幫助大家解決好 Docker 方面的時區(qū)問題漆羔。