欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

在Docker容器中部署Django的時(shí)區(qū)問(wèn)題

 更新時(shí)間:2021年10月20日 11:42:54   作者:Python集結(jié)號(hào)  
本文主要介紹了在Docker容器中部署Django的時(shí)區(qū)問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

現(xiàn)在容器化部署已經(jīng)非常成熟了,我們很多服務(wù)都會(huì)使用容器部署,更新恢復(fù)都非常方便,但是有一個(gè)問(wèn)題比較麻煩,就是時(shí)區(qū)處理,通常情況下,都采用注入 TZ 環(huán)境變量來(lái)解決,但是實(shí)際這種處理方式在 django 中卻是不行的。

Django 中與時(shí)區(qū)有關(guān)的配置

在Django的配置文件 settings.py 中,有兩個(gè)配置參數(shù)是跟時(shí)間與時(shí)區(qū)有關(guān)的,分別是TIME_ZONE和USE_TZ。我們期望著通過(guò)在 settings.py 中配置以后,Django 就能正確地獲取本地時(shí)間,但是實(shí)際上卻事與愿違,我們看一看這兩個(gè)設(shè)置有什么作用。

USE_TZ=True

如果 USE_TZ 設(shè)置為 True 時(shí),Django 會(huì)使用系統(tǒng)默認(rèn)設(shè)置的時(shí)區(qū),此時(shí)的 TIME_ZONE 的設(shè)置基本是無(wú)效的,也就是無(wú)論有沒(méi)有設(shè)置都不起作用。

USE_TZ=False

如果 USE_TZ 設(shè)置為 False

  1. TIME_ZONE 設(shè)置為 None
  2. Django 還是會(huì)使用默認(rèn)的時(shí)區(qū)
  3. 若 TIME_ZONE 設(shè)置為其它時(shí)區(qū)的話

如果是 Windows 系統(tǒng),則 TIME_ZONE 設(shè)置是沒(méi)用的,Django會(huì)使用本機(jī)的時(shí)間
如果是其他系統(tǒng),則會(huì)使用該時(shí)區(qū)的 UTC 時(shí)間

例如設(shè)置 USE_TZ = False, TIME_ZONE = ‘Asia/Shanghai', 則使用上海的 UTC 時(shí)間。

到這一步,可能你會(huì)認(rèn)為時(shí)間已經(jīng)好了,但是實(shí)際上還沒(méi)有,我們還需要關(guān)注系統(tǒng)時(shí)區(qū)的設(shè)置。

Linux 容器中時(shí)區(qū)的設(shè)置

現(xiàn)在我本地時(shí)間是:16:15,Django 中設(shè)置為:USE_TZ = False, TIME_ZONE = ‘Asia/Shanghai'

不注入 TZ=Asia/Shanghai 環(huán)境變量
進(jìn)入容器查看容器時(shí)間和時(shí)區(qū)

系統(tǒng)時(shí)間顯示的是 UTC 時(shí)區(qū),時(shí)間為:08:15,剛好差 8 個(gè)小時(shí)

進(jìn)入 Django 環(huán)境查看時(shí)間和時(shí)區(qū)

python manage.py shell 
 
from datetime import datetime 
datetime.now() 
# 輸出 datetime.datetime(2021, 10, 8, 8, 24, 8, 289230) 
 
from django.utils import timezone 
timezone.get_current_timezone_name() 
# 輸出 'Asia/Shanghai' 

注入環(huán)境變量 TZ=Asia/Shanghai
進(jìn)入容器查看時(shí)間和時(shí)區(qū)

系統(tǒng)時(shí)間顯示的是 Asia 時(shí)區(qū),但是時(shí)間依然是 UTC 時(shí)間,并沒(méi)有顯示真正的本地時(shí)間

進(jìn)入 Django 環(huán)境查看時(shí)間和時(shí)區(qū)

python manage.py shell 
 
from datetime import datetime 
datetime.now() 
# 輸出 datetime.datetime(2021, 10, 8, 8, 24, 8, 289230) 
 
from django.utils import timezone 
timezone.get_current_timezone_name() 
# 輸出 'Asia/Shanghai' 

可以看到,雖然時(shí)區(qū)變了,但是時(shí)間卻還是 UTC 時(shí)間,無(wú)論是容器本身還是 Django 中

通過(guò)在網(wǎng)上查詢,我們知道修改 Linux 系統(tǒng)時(shí)區(qū)要修改 /etc/localtime 文件

修改 Linux 容器時(shí)區(qū)

通常的做法是將宿主機(jī)的 /etc/localtime 文件拷貝到容器的 /etc/localtime 文件,但是我們通過(guò)查詢發(fā)現(xiàn) /etc/localtime 文件實(shí)際只是一個(gè)軟連接,實(shí)際的文件是:/usr/share/zoneinfo/Asia/Shanghai

docker cp /usr/share/zoneinfo/Asia/Shanghai test:/etc/localtime
在不給容器注入 TZ=Asia/Shanghai 環(huán)境變量的情況下,我們登錄容器發(fā)現(xiàn),容器的系統(tǒng)時(shí)間已經(jīng)正確獲取到本地時(shí)間和時(shí)區(qū)了

如果注入了 TZ=Asia/Shanghai 環(huán)境變量,即使把 /etc/localtime 文件替換了,也只是時(shí)區(qū)改變了,時(shí)間依然是 UTC 時(shí)間

進(jìn)入 Django 環(huán)境查看時(shí)間

python manage.py shell 
 
from datetime import datetime 
datetime.now() 
# 輸出 datetime.datetime(2021, 10, 8, 8, 43, 43, 754698) 

Linux 系統(tǒng)時(shí)間已經(jīng)正常了,但是 Django 環(huán)境中的時(shí)間還是不正確,依然是 UTC 時(shí)間,這時(shí)候很多人就有點(diǎn)抓狂了,可能覺(jué)得是 settings.py 中的 USE_TZ 和 TIME_ZONE 設(shè)置有問(wèn)題,其實(shí)問(wèn)題并不在這里。原因是因?yàn)?datetime 庫(kù)會(huì)去 /usr/share/zoneinfo/ 目錄下尋找 Asia/Shanghai 這個(gè)文件,而我們的鏡像中不包含這個(gè)目錄,所以 Django 還是使用了 UTC 時(shí)區(qū)。解決的辦法非常簡(jiǎn)單:創(chuàng)建 /usr/share/zoneinfo/Asia 目錄,拷貝文件到這個(gè)目錄下就行了

# 在容器內(nèi)(如不不存在這個(gè)目錄) 
mkdir -p /usr/share/zoneinfo/Asia 
 
# 在容器外 
docker cp /usr/share/zoneinfo/Asia/Shanghai test:/usr/share/zoneinfo/Asia/Shanghai 

然后登錄到容器內(nèi),進(jìn)入 Django 環(huán)境下查看時(shí)間

python manage.py shell 
 
from datetime import datetime 
datetime.now() 
#輸出 datetime.datetime(2021, 10, 8, 16, 49, 32, 57) 

這下時(shí)間就完全正確了。

總結(jié)

對(duì)于容器時(shí)區(qū)的問(wèn)題,建議在容器制作階段,安裝并設(shè)置好 /etc/localtime,例如在 dockerfile 中添加如下語(yǔ)句

ADD /usr/share/zoneinfo/Asia/Shanghai /usr/share/zoneinfo/Asia/Shanghai 
 
RUN ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 

這樣我們的容器在啟動(dòng)時(shí)就無(wú)需關(guān)注時(shí)區(qū)問(wèn)題了,如果容器已經(jīng)制作好了,在啟動(dòng)的時(shí)候掛載一下時(shí)區(qū)文件

docker run -d -v /etc/localtime:/etc/localtime -v /usr/share/zoneinfo/Asia/Shanghai:/usr/share/zoneinfo/Asia/Shanghai imageName 

這種方式就比較麻煩。還有一種情況就是我們現(xiàn)在碰到的,服務(wù)已經(jīng)上線了,發(fā)現(xiàn)時(shí)間有問(wèn)題,就手動(dòng)拷貝一下那兩個(gè)文件到容器中,然后重啟一下容器

docker cp /usr/share/zoneinfo/Asia/Shanghai test:/etc/localtime 
docker cp /usr/share/zoneinfo/Asia/Shanghai test:/usr/share/zoneinfo/Asia/Shanghai 
docker restart test 

到此這篇關(guān)于在Docker容器中部署Django的時(shí)區(qū)問(wèn)題的文章就介紹到這了,更多相關(guān)Docker部署Django時(shí)區(qū)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • docker搭建xxl-job的實(shí)現(xiàn)步驟

    docker搭建xxl-job的實(shí)現(xiàn)步驟

    XXL-JOB是一個(gè)輕量級(jí)分布式任務(wù)調(diào)度平臺(tái),通過(guò)xxljob,我們可以方便地實(shí)現(xiàn)任務(wù)調(diào)度和任務(wù)執(zhí)行監(jiān)控,本文介紹了docker搭建xxl-job的實(shí)現(xiàn)步驟,感興趣的可以了解一下
    2023-12-12
  • 清理docker占用磁盤過(guò)大問(wèn)題終極方案(親測(cè)有效!)

    清理docker占用磁盤過(guò)大問(wèn)題終極方案(親測(cè)有效!)

    Docker很占用空間每當(dāng)我們運(yùn)行容器、拉取鏡像、部署應(yīng)用、構(gòu)建自己的鏡像時(shí)我們的磁盤空間會(huì)被大量占用,這篇文章主要給大家介紹了關(guān)于清理docker占用磁盤過(guò)大問(wèn)題終極方案,需要的朋友可以參考下
    2024-04-04
  • 如何基于Dockerfile構(gòu)建tomcat鏡像

    如何基于Dockerfile構(gòu)建tomcat鏡像

    這篇文章主要介紹了如何基于Dockerfile構(gòu)建tomcat鏡像,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Docker打包SpringBoot鏡像的實(shí)現(xiàn)方式

    Docker打包SpringBoot鏡像的實(shí)現(xiàn)方式

    docker打包springboot鏡像,并不是簡(jiǎn)單的將springboot項(xiàng)目的jar包上傳容器里,然后啟動(dòng),這個(gè)操作很簡(jiǎn)單,但是如果我每次要查看容器中的日志就需要每次都進(jìn)入容器內(nèi)部進(jìn)行查看,這就非常麻煩了,所以本文介紹了Docker打包SpringBoot鏡像的實(shí)現(xiàn)方式,需要的朋友可以參考下
    2024-03-03
  • Docker部署golang環(huán)境詳解

    Docker部署golang環(huán)境詳解

    最近想學(xué)習(xí)一下golang,自己之前一直把環(huán)境全部安裝在docker上,所以這次也想把golang的環(huán)境安裝在docker上,先不廢話,直接上手
    2022-08-08
  • docker寫一個(gè)Dockerfile文件的實(shí)現(xiàn)

    docker寫一個(gè)Dockerfile文件的實(shí)現(xiàn)

    Dockerfile 是一個(gè)用來(lái)構(gòu)建鏡像的文本文件,文本內(nèi)容包含了一條條構(gòu)建鏡像所需的指令和說(shuō)明,本文主要介紹了docker寫一個(gè)Dockerfile文件的實(shí)現(xiàn)
    2024-01-01
  • docker容器運(yùn)行后退出(怎么才能一直運(yùn)行)

    docker容器運(yùn)行后退出(怎么才能一直運(yùn)行)

    這篇文章主要介紹了docker容器運(yùn)行后退出(怎么才能一直運(yùn)行),本文詳細(xì)的介紹了解決方法,非常具有實(shí)用價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • 如何使用docker部署Dashdot工具箱

    如何使用docker部署Dashdot工具箱

    dashdot是一個(gè)簡(jiǎn)潔清晰的服務(wù)器數(shù)據(jù)儀表板,基于React實(shí)現(xiàn) ,主要是顯示操作系統(tǒng)、進(jìn)程、存儲(chǔ)、內(nèi)存、網(wǎng)絡(luò)這五個(gè)的數(shù)據(jù),這篇文章主要介紹了如何使用docker部署Dashdot工具箱,需要的朋友可以參考下
    2024-02-02
  • docker入門之容器介紹

    docker入門之容器介紹

    這篇文章主要介紹了docker入門之容器介紹的相關(guān)資料,需要的朋友可以參考下
    2018-10-10
  • Docker教程:使用容器(簡(jiǎn)單示例)

    Docker教程:使用容器(簡(jiǎn)單示例)

    今天小編就為大家分享一篇關(guān)于Docker教程:使用容器(簡(jiǎn)單示例),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-10-10

最新評(píng)論