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

go語(yǔ)言題解LeetCode228匯總區(qū)間示例詳解

Go語(yǔ)言工程實(shí)踐單元測(cè)試基準(zhǔn)測(cè)試示例詳解

Golang AGScheduler動(dòng)態(tài)持久化任務(wù)調(diào)度的強(qiáng)大庫(kù)使用實(shí)例

Golang利用Recover進(jìn)行錯(cuò)誤處理