2016-07-26

設定 Docker Container 與 Host 相同時區的方法

關於 Docker Container 的時區的問題,阿舍從來就沒有想過有這個問題會出現,一直到最近,阿舍要在一個虛擬機器上同時啟動多個 Conatiner 來讀寫同一個資料夾的檔案時才注意到,這個資料夾裡的檔案的時間註記怎麼怪怪的,然後,才想到 ... 阿舍好像沒有把每個 Conatiner 的時區設定成和 Host 一樣哩 !



關於這個問題的解決方法,阿舍的想法很簡單,因為,阿舍的這幾個 Container 的 Image 都是自己 Build 的,所以,阿舍就在 Dockerfile 裡多加上時區的設定就可以搞定了,這個看來不是什麼大問題,不過,後來,阿舍想想,好像不太對,如果阿舍今天用的是別人弄好的 Docker Image 的話,那是不是都要再用 Dockerfile 的方式來自己再包一次 Imgae,這樣會不會太麻煩了哩 ...

嗯 ! 阿舍查了一下,果然,有不少人有跟阿舍一樣的問題,所以,當然就會有更簡單的解決方式哩 ! 解決的方法總共有二種,是在 Docker 用 run 指令啟動 Container 的時候,分別利用下面所列的 -v 選項和 -e 選項來連結檔案或設定環境變數的方式來達成的。


方法一
-v /etc/localtime:/etc/localtime:ro

方法二
-e "TZ=Asia/Taipei"

阿舍是在用 Alpine Linux 包成的 Image 試了上面二種方式,結果,只有第一種方式可行,阿舍查了一下,是因為 Alpine Linux 還需要安裝額外的套件才可使用,但是,阿舍看了網路上的討論,似乎很多人是用第二種方式成功的人比較外哩 ! 所以,如果有需要的話,阿舍建議兩種都給他試一下,然後,再選一種自己喜歡的方式或可以用的方式哩 ...

好,那設定好之後要怎知設定有沒有成功和生效呢 ? 這個的話,就請參考阿舍寫的這一篇來進入這個 Docker Conatiner 的終端畫面來執行 date 指令,這樣就可以看到 Container 裡的時間對不對了哩 ...

另外,阿舍要補充的就是,如果你是用上面的方法一的方式的話,要記得確定你的 Host 是不是在 /etc 下有 localtime 這個檔案,如果沒有的話,那就要改用方法二,而如果不幸都不行,那就只能利用 Dockerfile 來先在 Image 就設定好和 Host 相的時區,不過,當把這個 Image 換到不同時區的 Host 來執行時,就會需要重新 Build Image,可攜性就大大的降低了哩 ...



推薦閱讀


有疑問? 問題還是沒解決嗎? 歡迎下方留言提問和討論 😁

2 則留言 :

Unknown 提到...

請問,如果用這兩種方法都沒用呢?我用docker-compose 弄了一個librenms出來,可是一直沒辦法改tzdata

也已經改了docker-compose.yml的內容如下

web:
image: jarischaefer/docker-librenms
hostname: librenms
ports:
- "8001:80"
- "44301:443"
volumes:
- /etc/hosts:/etc/hosts
- /etc/localtime:/etc/localtime:ro
environment:
- TZ="Asia/Taipei"

匿名 提到...

這個問題是在compose file 中設置變數不要加雙引號
environment:
- TZ=Asia/Taipei

張貼留言

歡迎留言提問和討論 .... 😁