背景
這兩天在打docker的時(shí)候,發(fā)現(xiàn)自己的容器啟動(dòng)之后,里面date -R的輸出時(shí)區(qū)是UTC,總是和北京時(shí)間差了8個(gè)小時(shí)。
標(biāo)準(zhǔn)鏡像
時(shí)區(qū)是UTC
查看/etc/localtime,發(fā)現(xiàn)默認(rèn)指向的是Etc/UTC時(shí)區(qū)。而且TZ環(huán)境變量也沒有被設(shè)置。
linux中的時(shí)區(qū)問題到底是怎么處理的
實(shí)際上,我們所有關(guān)于時(shí)區(qū)處理的問題都是glibc中處理時(shí)區(qū)的問題。 這個(gè)問題最權(quán)威的文檔就是glibc的官方文檔,里面關(guān)于TZ環(huán)境變量的描述介紹了時(shí)區(qū)問題的處理。
https://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html#TZ-Variable
其中和我們相關(guān)的部分如下。
核心意思如下: 在glibc中,TZ環(huán)境變量的值是一個(gè)文件的名字,這個(gè)文件的內(nèi)容描述了時(shí)區(qū)相關(guān)的信息。
如果TZ這個(gè)環(huán)境變量沒有設(shè)置,那么系統(tǒng)會(huì)選擇一個(gè)默認(rèn)值,在glibc中,其默認(rèn)值為/etc/localtime. 如果TZ環(huán)境變量有值,并且這個(gè)值是以/開頭的,那么是一個(gè)絕對(duì)路徑的文件名,否則文件名為/usr/share/zoneinfo/$TZ. /usr/share/zoneinfo目錄下面有世界各地的本地時(shí)間信息,比如Asia/Shanghai.一般這個(gè)目錄下面的文件是被tzdata這個(gè)包安裝的。
按照這個(gè)思路,我們強(qiáng)制指定TZ環(huán)境變量為Asia/Shanghai,時(shí)區(qū)正確
強(qiáng)制修改/etc/localtime文件,時(shí)區(qū)也正確。
docker容器處理時(shí)區(qū)的方法
根據(jù)上面的描述,在docker容器中設(shè)置時(shí)區(qū)其實(shí)有兩個(gè)主要的方法。 一個(gè)是直接進(jìn)行TZ環(huán)境變量設(shè)置,另一個(gè)是不設(shè)置TZ環(huán)境變量,直接修改/etc/localtime的內(nèi)容(通過軟鏈接或者文件直接復(fù)制都可以)
這里以設(shè)置TZ環(huán)境變量為例(我自己比較喜歡這樣做,感覺比修改/etc/localtime更方便)。
首先,我們可以在Dockerfile里面添加ENV TZ=Asia/Shanghai,這樣docker build出來的鏡像默認(rèn)TZ環(huán)境變量就是我們要的值了。
其次,我們也可以在容器拉起的時(shí)候使用-e TZ=Asia/Shanghai進(jìn)行TZ環(huán)境變量設(shè)置,這個(gè)設(shè)置就是動(dòng)態(tài)的,同一個(gè)鏡像我們可以在拉起的時(shí)候設(shè)置不同的值。
總結(jié)
docker中的時(shí)區(qū)處理實(shí)際上就是glibc中的時(shí)區(qū)處理,了解了glibc中對(duì)事情的處理方法,核心是TZ環(huán)境變量和/etc/localtime文件,docker中的時(shí)期問題處理就簡(jiǎn)單了.
-
Linux
+關(guān)注
關(guān)注
87文章
11351瀏覽量
210512
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
【Intel Edison試用體驗(yàn)】+edison時(shí)區(qū)設(shè)置
Linux系統(tǒng)的正確時(shí)區(qū)調(diào)整方法
怎樣去修改嵌入式Linux的中時(shí)區(qū)呢
Linux系統(tǒng)時(shí)間分為哪幾種
怎樣在嵌入式linux中修改時(shí)區(qū)呢
嵌入式 linux對(duì)TZ時(shí)區(qū)是如何設(shè)置的
linux系統(tǒng)的時(shí)區(qū)有哪些
Java中如何顯示不同時(shí)區(qū)的時(shí)間(原理詳解)
Linux內(nèi)核到底是什么應(yīng)該如何學(xué)習(xí)
嵌入式Linux 硬件時(shí)間-系統(tǒng)時(shí)間-時(shí)區(qū)設(shè)置
![嵌入式<b class='flag-5'>Linux</b> 硬件時(shí)間-系統(tǒng)時(shí)間-<b class='flag-5'>時(shí)區(qū)</b>設(shè)置](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
嵌入式Linux中時(shí)區(qū)的修改
![嵌入式<b class='flag-5'>Linux</b><b class='flag-5'>中</b><b class='flag-5'>時(shí)區(qū)</b>的修改](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
嵌入式linux中設(shè)置時(shí)區(qū)
![嵌入式<b class='flag-5'>linux</b><b class='flag-5'>中</b>設(shè)置<b class='flag-5'>時(shí)區(qū)</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
嵌入式 linux 對(duì)時(shí) TZ時(shí)區(qū)設(shè)置
![嵌入式 <b class='flag-5'>linux</b> 對(duì)時(shí) TZ<b class='flag-5'>時(shí)區(qū)</b>設(shè)置](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
linux與window如何統(tǒng)一都顯示為中國時(shí)區(qū)的時(shí)間
![<b class='flag-5'>linux</b>與window如何統(tǒng)一都顯示為中國<b class='flag-5'>時(shí)區(qū)</b>的時(shí)間](https://file.elecfans.com/web2/M00/62/F6/poYBAGL_XoeAekElAABoGHz_0LY530.png)
評(píng)論