91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在Docker容器中部署Django的時區問題

發布時間:2021-10-20 13:35:09 來源:億速云 閱讀:162 作者:iii 欄目:開發技術

這篇文章主要介紹“如何在Docker容器中部署Django的時區問題”,在日常操作中,相信很多人在如何在Docker容器中部署Django的時區問題問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如何在Docker容器中部署Django的時區問題”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

目錄
  • Django 中與時區有關的配置

    • USE_TZ=True

    • USE_TZ=False

  • Linux 容器中時區的設置

    • 進入 Django 環境查看時間和時區

      • 修改 Linux 容器時區

        • 進入 Django 環境查看時間

          • 總結

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

            Django 中與時區有關的配置

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

            USE_TZ=True

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

            USE_TZ=False

            如果 USE_TZ 設置為 False

            1. TIME_ZONE 設置為 None

            2. Django 還是會使用默認的時區

            3. 若 TIME_ZONE 設置為其它時區的話

            如果是 Windows 系統,則 TIME_ZONE 設置是沒用的,Django會使用本機的時間
            如果是其他系統,則會使用該時區的 UTC 時間

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

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

            Linux 容器中時區的設置

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

            不注入 TZ=Asia/Shanghai 環境變量
            進入容器查看容器時間和時區

            如何在Docker容器中部署Django的時區問題

            系統時間顯示的是 UTC 時區,時間為:08:15,剛好差 8 個小時

            進入 Django 環境查看時間和時區

            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'

            注入環境變量 TZ=Asia/Shanghai
            進入容器查看時間和時區

            如何在Docker容器中部署Django的時區問題

            系統時間顯示的是 Asia 時區,但是時間依然是 UTC 時間,并沒有顯示真正的本地時間

            進入 Django 環境查看時間和時區

            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'

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

            通過在網上查詢,我們知道修改 Linux 系統時區要修改 /etc/localtime 文件

            修改 Linux 容器時區

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

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

            如何在Docker容器中部署Django的時區問題

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

            進入 Django 環境查看時間

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

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

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

            然后登錄到容器內,進入 Django 環境下查看時間

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

            這下時間就完全正確了。

            總結

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

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

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

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

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

            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的時區問題”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

            向AI問一下細節

            免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

            AI

            中阳县| 太仆寺旗| 赞皇县| 旬阳县| 女性| 临泽县| 固安县| 从江县| 刚察县| 仪陇县| 安仁县| 内乡县| 克拉玛依市| 丰原市| 昭觉县| 逊克县| 镇坪县| 鸡西市| 犍为县| 翁牛特旗| 南丰县| 太白县| 海晏县| 金坛市| 岳阳市| 株洲县| 长汀县| 通山县| 上高县| 霍山县| 陵川县| 容城县| 甘肃省| 屯昌县| 卢氏县| 阿巴嘎旗| 融水| 大埔县| 凤城市| 山丹县| 克东县|