最近幫朋友處理有關 docker 的一些小問題
我朋友說他去用了別人寫好的 docker-compose ,up 之後會產生 web, db 兩個 container ,但他在操作資料時發現寫入時間不對。
後來除錯時發現其實是系統時區的問題,web 的系統是 centos 7.7 ,而 db 是 debian (版本忘了),他兩個 container 都利用「ln -sf /usr/share/zoneinfo/Asia/Taipei /etc/localtime」來設定時區,結果發現只有 db 有修正,由 utc → cst ,但 web 還是依舊維持在 cest ,沒有更動過去。
他在 web 想使用「timedatectl set-timezone Asia/Taipei」時發現出現「failed to create bus connection no such file or directory」,他上網 google 後發現有人說要讓 docker 以 privileged 模式啟動 container 才能讓 container 的 root 真的有最高權限,但也有相關資料顯示 docker container 不該以 privileged 模式啟動,因為風險很大,所以朋友就來問我看有沒有什麼方式。
從 docker-compose.yml 下手,可以在 web 與 db 的「environment」的區塊下增加「- TZ=Asia/Taipei」或「TZ: Asia/Taipei」可以讓 container 啟動後設定為 Asia/Taipei 的時區,且 web 和 db 都支援這個方式。
至於為什麼會有「- TZ=Asia/Taipei」跟「TZ: Asia/Taipei」兩種寫法,似乎是跟 docker-compose 的版本有關,後者,也就是「TZ: Asia/Taipei」是比較新式的寫法,如果有發現使用了「- TZ=Asia/Taipei」後在 up 時出現錯誤,可以修改為「TZ: Asia/Taipei」的方式來重新 up 。
另外,「- TZ="Asia/Taipei"」的寫法是錯誤的,記得不要加雙引號