成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

系統(tǒng) Linux
我們期望著通過在 settings.py 中配置以后,Django 就能正確地獲取本地時間,但是實際上卻事與愿違,我們看一看這兩個設(shè)置有什么作用。

[[428513]]

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

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

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

USE_TZ=True

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

USE_TZ=False

如果 USE_TZ 設(shè)置為 False

  • TIME_ZONE 設(shè)置為 None
  • Django 還是會使用默認(rèn)的時區(qū)
  • 若 TIME_ZONE 設(shè)置為其它時區(qū)的話
  1. 如果是 Windows 系統(tǒng),則 TIME_ZONE 設(shè)置是沒用的,Django會使用本機的時間
  2. 如果是其他系統(tǒng),則會使用該時區(qū)的 UTC 時間

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

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

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

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

不注入 TZ=Asia/Shanghai 環(huán)境變量

進(jìn)入容器查看容器時間和時區(qū)

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

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

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

  1. python manage.py shell 
  2.  
  3. from datetime import datetime 
  4. datetime.now() 
  5. # 輸出 datetime.datetime(2021, 10, 8, 8, 24, 8, 289230) 
  6.  
  7. from django.utils import timezone 
  8. timezone.get_current_timezone_name() 
  9. # 輸出 'Asia/Shanghai' 

注入環(huán)境變量 TZ=Asia/Shanghai

進(jìn)入容器查看時間和時區(qū)

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

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

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

  1. python manage.py shell 
  2.  
  3. from datetime import datetime 
  4. datetime.now() 
  5. # 輸出 datetime.datetime(2021, 10, 8, 8, 24, 8, 289230) 
  6.  
  7. from django.utils import timezone 
  8. timezone.get_current_timezone_name() 
  9. # 輸出 'Asia/Shanghai' 

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

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

修改 Linux 容器時區(qū)

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

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

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

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

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

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

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

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

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

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

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

這下時間就完全正確了。

總結(jié)

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

  1. ADD /usr/share/zoneinfo/Asia/Shanghai /usr/share/zoneinfo/Asia/Shanghai 
  2.  
  3. RUN ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 

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

  1. 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)時間有問題,就手動拷貝一下那兩個文件到容器中,然后重啟一下容器

  1. docker cp /usr/share/zoneinfo/Asia/Shanghai test:/etc/localtime 
  2. docker cp /usr/share/zoneinfo/Asia/Shanghai test:/usr/share/zoneinfo/Asia/Shanghai 
  3. docker restart test 

 

責(zé)任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2017-08-08 11:14:47

AzureKubernetes多容器應(yīng)用程序

2019-09-20 08:47:57

DockerLinux軟件

2021-01-18 09:08:44

樹莓派Ceph開源

2020-11-13 09:22:32

Docker數(shù)據(jù)庫容器

2017-06-01 12:30:59

SQL云計算云端

2019-08-19 14:06:27

MySQLDocker數(shù)據(jù)庫

2012-12-07 10:17:37

IBMdW

2021-11-02 17:27:40

部署高可用Kubernetes

2022-08-31 08:30:32

kubernetesMetalLB

2019-07-01 09:33:58

DockerNginx操作系統(tǒng)

2010-05-26 10:12:43

部署IPv6網(wǎng)絡(luò)

2009-06-24 15:05:00

2024-02-19 16:25:29

前端Vue.jsJavaScript

2012-05-07 08:33:20

dotcloudDjango

2009-06-12 18:46:30

Django模塊部署

2015-07-30 10:45:15

2009-04-21 09:56:58

AzureMVCASP.NET

2019-12-05 10:40:41

DockerMySQL數(shù)據(jù)庫

2011-11-25 09:55:00

MPLSWeb應(yīng)用加速WAN優(yōu)化

2016-12-07 09:06:53

點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 在线播放中文 | 精品一区视频 | 国产精品九九视频 | 国产我和子的乱视频网站 | 91在线网站 | 中文字幕 国产 | 午夜精品一区二区三区在线视频 | 91在线观看免费视频 | 久久精品视频免费观看 | 九色 在线| 男女网站视频 | 亚洲人成人一区二区在线观看 | 久久精品免费观看 | 亚洲天堂精品久久 | 91精品国产综合久久婷婷香蕉 | 国产激情网 | 日本不卡一区二区三区 | 日韩国产中文字幕 | 黑人精品欧美一区二区蜜桃 | 97精品久久 | av一区二区三区四区 | 国产精品电影在线观看 | 国产精品揄拍一区二区久久国内亚洲精 | 亚洲福利 | 在线看免费的a | www.亚洲一区二区 | 国产精品久久久久久久免费大片 | 热久久免费视频 | 日韩三级 | 男女羞羞视频大全 | 欧美日韩在线一区二区三区 | 在线成人免费视频 | 亚洲v日韩v综合v精品v | 欧美一区视频 | 欧美亚洲国语精品一区二区 | 69av片| 免费日本视频 | 精品免费国产视频 | 日韩中文一区 | 午夜大片 | 在线免费观看亚洲 |