win11下的docker中有個mysql。今天發現插入數據的時間不正確。后來發現原來是docker容器中的時間不正確。于是嘗試了各種修改,什么run -e TZ="${tzutil /g}",TZ="Asia/Shanghai",還有初始化時帶--mysqld一類的,都無效。
后來偶然間發現wsl中的docker-desktop中的時間和mysql中的一致,才突然想到,其實容器是運行在docker-desktop這個發行版中的,所以它的環境就是各容器的環境,于是進入docker-desktop,執行:
#在wsl中修改系統時間
date -s "2025-06-03 13:50"
使用date修改為當前時間即可。
/************************************ 又發現點問題,更新一下 *****************************************/
根據上面的修改,改完后,過一會時間又恢復了不正確的時間。初步原因如下:
docker-desktop是基于alpine linux。它直接date -s修改時間后,過一會會自動同步為UTC標準時間。如果查看win平臺,會發現win其實是使用了UTC+8,它是在utc的基礎上偏移8小時,獲得當前區域時間。而docker-desktop只是同步了UTC,而未偏移,這一點使用
# 查看標準硬件時間
hwclock -r
可以發現,它后面的延遲是0,即標準UTC時間,而不是UTC+8。
于是需要將alpine中的時區替換為CST8,這一步中,如果你的網絡足夠好,可以撐桿跳,那直接安裝tzdata即可。如果像我這一樣,根本連不上,而wsl中恰好還有一個ubuntu的時候,方案就有了。步驟為:從ubuntu中將/usr/share/zoneinfo/Asia文件夾中的內容,復制到docker-desktop中,再創建一個軟鏈接即可。
# 登陸wsl,注意這里使用root用戶,否則就會像我一樣,被要求輸入一個誰也不知道的密碼
wsl -u root
# 登陸后,復制文件
cd /usr/share/zoneinfo/
tar -czvf Asia.tar.gz Asia/
mv Asia.tar.gz /mnt/c/tmp/
exit
# 這樣就將Asia.tar.gz復制到c:\tmp文件中了
# 登陸docker對應的linux
wsl -d docker-desktop
mv /mnt/host/c/tmp/Asia.tar.gz /usr/share/zoneinfo #如果沒有這個目錄,建一個
cd /usr/share/zoneinfo
tar -xzvf Asia.tar.gz
#復制完成了
# 創建一個鏈接
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
如果執行完了,都沒有報錯,則執行date后,會發現時區變為了CST,時間也正確了。
但是!!!容器中的時間和docker-desktop發行版中的時區是獨立的。于是創建新的容器
docker run -d --name mysql \-v volume_name:/var/lib/mysql \ # 自己的volume的設置-e MYSQL_ROOT_PASSWORD=root \-e TZ=Asia/Shanghai \ # 這個是關鍵-p 3306:3306 mysql:8 \--lower-case-table-names=1
然后再select now()查看一下,發現時間一致了。