Docker容器中部署Django的時區問題
現在容器化部署已經非常成熟了,我們很多服務都會使用容器部署,更新恢復都非常方便,但是有一個問題比較麻煩,就是時區處理,通常情況下,都採用注入 TZ 環境變數來解決,但是實際這種處理方式在 django 中卻是不行的。
在Django的配置檔案 settings.py 中,有兩個配置引數是跟時間與時區有關的,分別是TIME_ZONE和USE_TZ。我們期望著通過在 settings.py 中配置以後,Django 就能正確地獲取本地時間,但是實際上卻事與願違,我們看一看這兩個設定有什麼作用。
如果 USE_TZ 設定為 True 時,Django 會使用系統預設設定的時區,此時的 TIME_ZONE 的設定基本是無效的,也就是無論有沒有設定都不起作用。
如果 USE_TZ 設定為 False
- TIME_ZONE 設定為 None
- Django 還是會使用預設的時區
- 若 TIME_ZONE 設定為其它時區的話
- 如果是 Windows 系統,則 TIME_ZONE 設定是沒用的,Django會使用本機的時間
- 如果是其他系統,則會使用該時區的 UTC 時間
例如設定 USE_TZ = False, TIME_ZONE = ‘Asia/Shanghai’, 則使用上海的 UTC 時間。
到這一步,可能你會認為時間已經好了,但是實際上還沒有,我們還需要關注系統時區的設定。
現在我本地時間是:16:15,Django 中設定為:USE_TZ = False, TIME_ZONE = ‘Asia/Shanghai’
進入容器檢視容器時間和時區
系統時間顯示的是 UTC 時區,時間為:08:15,剛好差 8 個小時
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
進入容器檢視時間和時區
系統時間顯示的是 Asia 時區,但是時間依然是 UTC 時間,並沒有顯示真正的本地時間
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 檔案
通常的做法是將宿主機的 /etc/localtime 檔案拷貝到容器的 /etc/localtime 檔案,但是我們通過查詢發現 /etc/localtime 檔案實際只是一個軟連線,實際的檔案是:/usr/share/zoneinfo/Asia/Shanghai
在不給容器注入 TZ=Asia/Shanghai 環境變數的情況下,我們登入容器發現,容器的系統時間已經正確獲取到本地時間和時區了
如果注入了 TZ=Asia/Shanghai 環境變數,即使把 /etc/localtime 檔案替換了,也只是時區改變了,時間依然是 UTC 時間
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
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69901823/viewspace-2838313/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Django(13)django時區問題Django
- 修改Docker容器的時區為中國時區Docker
- 解決Docker容器時區及時間不同步的問題Docker
- Django的時區設定問題Django
- 使用Docker容器化部署實踐之Django應用部署(一)DockerDjango
- Docker容器內部修改時區Docker
- beego orm中時區的問題GoORM
- NSDate 時間比較中的時區問題.
- 啟動/刪除Docker容器時出現問題 - 如何修復Docker
- docker中的MySQL修改時區DockerMySql
- Docker容器 關於映象構建的安全問題Docker
- 1.06 docker Compose多容器部署Docker
- 百問百答第39期:如何區分docker容器中的程式名稱?Docker
- docker 部署 django + mysql + vue 專案DockerDjangoMySqlVue
- 容器化部署實踐之Django應用部署(二)Django
- 使用 pytz 處理 Python 中的時區問題Python
- Docker 容器 100 問Docker
- Tomcat 容器的時區更改為中國Tomcat
- docker容器與映象的區別Docker
- docker網路問題解決辦法“大全”:關於宿主機訪問不了docker容器中web服務,或者容器內訪問不了外網的問題的解決辦法DockerWeb
- 如何訪問Docker容器中的Spring Boot日誌DockerSpring Boot
- Linux 下部署Django專案你可能會遇到的問題!LinuxDjango
- docker 中容器通過 API 互相訪問DockerAPI
- docker 中容器透過 API 互相訪問DockerAPI
- Docker的安裝與容器應用部署Docker
- 遇到的編碼問題、時區問題整理
- 遊戲開發中不同時區下的時間問題遊戲開發
- Linux時區問題Linux
- Docker容器化部署Python應用DockerPython
- 使用Portainer部署Docker容器實踐AIDocker
- Docker 部署 Django+Uwsgi+Nginx+MySQL+VueDockerDjangoNginxMySqlVue
- Docker容器與虛擬化技術:OpenEuler 部署 docker容器應用Docker
- php部署到nginx時遇到的問題PHPNginx
- docker run 與docker start的區別,為容器命名Docker
- docker修改容器時間Docker
- Docker中部署mysql服務的方法及遇到的問題DockerMySql
- mysql的時區錯誤問題MySql
- Oracle的時區問題Time ZoneOracle