最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在Docker容器中部署Django的時區(qū)問題

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

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

Django 中與時區(qū)有關的配置

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

USE_TZ=True

如果 USE_TZ 設置為 True 時,Django 會使用系統(tǒng)默認設置的時區(qū),此時的 TIME_ZONE 的設置基本是無效的,也就是無論有沒有設置都不起作用。

USE_TZ=False

如果 USE_TZ 設置為 False

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

如果是 Windows 系統(tǒng),則 TIME_ZONE 設置是沒用的,Django會使用本機的時間
如果是其他系統(tǒng),則會使用該時區(qū)的 UTC 時間

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

到這一步,可能你會認為時間已經好了,但是實際上還沒有,我們還需要關注系統(tǒng)時區(qū)的設置。

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

現在我本地時間是:16:15,Django 中設置為:USE_TZ = False, TIME_ZONE = ‘Asia/Shanghai'

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

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

進入 Django 環(huán)境查看時間和時區(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
進入容器查看時間和時區(qū)

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

進入 Django 環(huán)境查看時間和時區(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' 

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

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

修改 Linux 容器時區(qū)

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

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

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

進入 Django 環(huán)境查看時間

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

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

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

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

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

這下時間就完全正確了。

總結

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

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

這樣我們的容器在啟動時就無需關注時區(qū)問題了,如果容器已經制作好了,在啟動的時候掛載一下時區(qū)文件

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

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

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 

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

相關文章

  • ubuntu22通過docker安裝wechat啟動后無界面的問題及解決方法

    ubuntu22通過docker安裝wechat啟動后無界面的問題及解決方法

    這篇文章主要介紹了ubuntu22通過docker安裝wechat啟動后無界面的解決方法,通過微信創(chuàng)建腳本發(fā)現一系列問題,最終在小編的努力下順利解決,下面把解決過程分享給大家,需要的朋友可以參考下
    2022-07-07
  • docker刪除鏡像的實現方式詳解

    docker刪除鏡像的實現方式詳解

    這篇文章主要為大家介紹了docker刪除鏡像的實現方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • Docker從零構建php-nginx-alpine鏡像的方法

    Docker從零構建php-nginx-alpine鏡像的方法

    這篇文章主要介紹了Docker從零構建php-nginx-alpine鏡像的方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • 詳解如何查看 docker 容器使用的資源

    詳解如何查看 docker 容器使用的資源

    本篇文章主要介紹了詳解如何查看 docker 容器使用的資源,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • docker搭建mongodb單節(jié)點副本集的實現

    docker搭建mongodb單節(jié)點副本集的實現

    本文主要介紹了docker搭建mongodb單節(jié)點副本集的實現,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Docker打印和配置環(huán)境變量的命令詳解

    Docker打印和配置環(huán)境變量的命令詳解

    在現代應用開發(fā)中,Docker 提供了一種有效的容器化解決方案,使得應用的部署、擴展和管理變得更加靈活,環(huán)境變量在容器化應用中起著重要作用,它們可以幫助配置應用的運行環(huán)境,本文給大家介紹了在 Docker 容器中打印和配置環(huán)境變量,需要的朋友可以參考下
    2024-10-10
  • docker備份linux系統(tǒng)的命令詳解

    docker備份linux系統(tǒng)的命令詳解

    這篇文章主要介紹了docker備份linux系統(tǒng)的命令寫法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-11-11
  • docker-compose安裝db2數據庫操作

    docker-compose安裝db2數據庫操作

    這篇文章主要介紹了docker-compose安裝db2數據庫操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • docker鏡像壓縮squash的實現

    docker鏡像壓縮squash的實現

    本文主要介紹了docker鏡像壓縮squash的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • docker kubernetes dashboard安裝部署詳細介紹

    docker kubernetes dashboard安裝部署詳細介紹

    這篇文章主要介紹了docker kubernetes dashboard安裝部署詳細介紹的相關資料,需要的朋友可以參考下
    2016-10-10

最新評論

乌鲁木齐县| 灵石县| 天气| 都安| 隆安县| 英山县| 宜川县| 宁波市| 根河市| 十堰市| 涿州市| 东海县| 闽清县| 新津县| 合江县| 洪雅县| 自治县| 白城市| 土默特左旗| 平果县| 贵定县| 正安县| 丰城市| 和顺县| 独山县| 仙桃市| 萝北县| 兴安盟| 泸水县| 蓬溪县| 阿鲁科尔沁旗| 尉氏县| 唐河县| 包头市| 宾阳县| 芜湖市| 基隆市| 克东县| 利津县| 大新县| 武隆县|