詳解如何在golang鏡像中設(shè)置指定時區(qū)
我們在構(gòu)建鏡像的時候,經(jīng)常會使用alphine
作為基礎(chǔ)鏡像,或者就直接從scratch
構(gòu)建了;這樣構(gòu)建之后的鏡像非常的小,傳輸也更加的快
但是這種鏡像也會有一個問題,就是只能使用UTC
時區(qū),不能加載別的時區(qū),因為鏡像中沒有包含時區(qū)文件;雖然UTC
時區(qū)也很好用,但是有時候在處理一些定時任務(wù),或者是打印日志時,還是希望能夠使用Local Time
為了解決這個問題,我們需要更改鏡像文件,將時區(qū)文件包含進去,然后使用ENV
設(shè)置本地時區(qū);
添加時區(qū)文件
在Go語言中,時區(qū)信息通常從操作系統(tǒng)環(huán)境變量中讀取。具體來說,它使用了名為TZ
的環(huán)境變量。如果未設(shè)置該變量,則使用操作系統(tǒng)的默認時區(qū)
首先,我們需要知道的是確定golang
會從哪些路徑中讀取時區(qū)文件,默認情況下,golang
會從如下的路徑中讀取時區(qū)文件:
/usr/share/zoneinfo/
/usr/share/lib/zoneinfo/
/usr/lib/locale/TZ/
當然,也可以通過ENV ZONEINFO
指定一個時區(qū)文件;那我們?nèi)绾螌r區(qū)文件放入到這些目錄下面呢
大部分時候,我們都可以從基礎(chǔ)鏡像中找到時區(qū)文件,然后將其添加到最終鏡像中就可以了;但是,有時候我們會使用golang:alphine
鏡像,這種鏡像本身并不包含時區(qū)文件,所以我們需要使用命令進行添加時區(qū)文件了,如下:
FROM golang:alpine as build RUN apk --no-cache add tzdata WORKDIR /app ADD . . RUN CGO_ENABLED=0 GOOS=linux go build -o myapp ? FROM scratch as final COPY --from=build /app/myapp . COPY --from=build /usr/share/zoneinfo /usr/share/zoneinfo ENV TZ=Asian/Shanghai CMD ["/myapp"]
我們通過命令RUN apk --no-cache add tzdata
添加時區(qū)文件,然后將其添加到最終鏡像中,最后通過ENV TZ
指定當前時區(qū),這樣問題就解決了
但是,有時候公司的防火墻可能會屏蔽掉這些源,這樣執(zhí)行RUN apk --no-cache add tzadd
時就會拉取不下來,那此時就需要其他的辦法找到時區(qū)文件了
幸運的是在golang
的庫中是包含時區(qū)文件的,位置在的$GOROOT/lib/time/zoneinfo.zip
,那么就可以直接將這個時區(qū)文件復(fù)制到image
當中了,如下:
FROM golang:alpine as build WORKDIR /app ADD . . RUN CGO_ENABLED=0 GOOS=linux go build -o myapp ? FROM scratch as final COPY --from=build /app/myapp . COPY --from=build /usr/local/go/lib/time/zoneinfo.zip / ENV TZ=Asian/Shanghai ENV ZONEINFO=/zoneinfo.zip CMD ["/myapp"]
在該dockerfile
中,我們使用ENV ZONEINFO
告訴golang
從哪取獲取時區(qū)文件,然后使用ENV TZ
指定當前的時區(qū),這樣就能夠保證鏡像能夠讀取到正確的時區(qū)文件了
到此這篇關(guān)于詳解如何在golang鏡像中設(shè)置指定時區(qū)的文章就介紹到這了,更多相關(guān)golang鏡像設(shè)置指定時區(qū)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

Golang AGScheduler動態(tài)持久化任務(wù)調(diào)度的強大庫使用實例