久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

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

 新用戶3488XG6a 2021-11-22
目錄

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

· USE_TZ=True

· USE_TZ=False

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

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

· 修改 Linux 容器時區(qū)

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

· 總結(jié)

現(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

1. TIME_ZONE 設(shè)置為 None

2. Django 還是會使用默認(rèn)的時區(qū)

3.  TIME_ZONE 設(shè)置為其它時區(qū)的話

如果是 Windows 系統(tǒng),則 TIME_ZONE 設(shè)置是沒用的,,Django會使用本機(jī)的時間
如果是其他系統(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ū)

 

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

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

1

2

3

4

5

6

7

8

9

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)入容器查看時間和時區(qū)

 

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

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

1

2

3

4

5

6

7

8

9

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 中

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

修改 Linux 容器時區(qū)

通常的做法是將宿主機(jī)的 /etc/localtime 文件拷貝到容器的 /etc/localtime 文件,,但是我們通過查詢發(fā)現(xiàn) /etc/localtime 文件實際只是一個軟連接,,實際的文件是:/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)時間已經(jīng)正確獲取到本地時間和時區(qū)了

 

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

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

1

2

3

4

5

python manage.py shell

from datetime import datetime

datetime.now()

# 輸出 datetime.datetime(2021, 10, 8, 8, 43, 43, 754698)

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

1

2

3

4

5

# 在容器內(nèi)(如不不存在這個目錄)

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)境下查看時間

1

2

3

4

5

python manage.py shell

from datetime import datetime

datetime.now()

#輸出 datetime.datetime(2021, 10, 8, 16, 49, 32, 57)

這下時間就完全正確了,。

總結(jié)

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

1

2

3

ADD /usr/share/zoneinfo/Asia/Shanghai /usr/share/zoneinfo/Asia/Shanghai

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

2

3

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

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多