在自己建立的 Debian docker image 設定時區

要把打包好的 JavaEE war 放到 jetty image 裡面不難,但後來發現將 image 部署到 GKE 上面後,系統時間是 UTC 時間,得改成台灣的時區(GMT+8)才行。
但問題來了,jetty 的 Debian image 預設使用者是 jetty,而這個使用者並沒有權限去執行這段命令,必須是 root 才行,要怎麼辦呢?

最近建立的服務,是使用 jetty middleware,搭配 jetty 的 docker image,部署在 Google Cloud Platform 的 Kubernetes Engine (簡稱 GKE)上面。

這年頭,還在用 Java 跑 middleware 的人,應該是老古董了吧?(笑)

說實在的,對於 container 架構還不是非常的熟悉,所以遇到問題就只能一個一個來解決。

要把打包好的 JavaEE war 放到 jetty image 裡面不難,但後來發現將 image 部署到 GKE 上面後,系統時間是 UTC 時間,得改成台灣的時區(GMT+8)才行。

要更動 Debian 上面的時區不難,只要執行底下的命令就可以了:

TZ=Asia/Taipei
ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

但問題來了,jetty 的 Debian image 預設使用者是 jetty,而這個使用者並沒有權限去執行這段命令,必須是 root 才行,要怎麼辦呢?

嘗試了 su、sudo 都不行,更不要說安裝 sudo(因為也必須要有 root 權限才能做啊!)。

後來才找到,原來在 Dockerfile 裡面可以去切換使用者,例子如下:

USER root
ENV TZ=Asia/Taipei
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

在 Dockerfile 裡面加上這段,包出來的 image 就會是台北時區(GMT+8)囉!

想知道有支援哪些時區?就去看看 /usr/share/zoneinfo 底下有哪些地區與城市,就知道囉!

Mark Su

熱愛籃球、程式設計與美食。

Add comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Follow us

Don't be shy, get in touch. We love meeting interesting people and making new friends.