應用上K8S第一步:Dockerfile引數化構建技巧

網路通訊頻道發表於2023-01-30

SpringBoot應用容器化上K8S,第一步就是透過maven或gradle進行映象打包,準備工作如下:

maven/gradle docker-plugin實行應用編譯打包;

Dockerfile,透過傳遞變數實現映象的引數化打包;

Docker中傳遞變數主要使用ARG和ENV,雖然功能相同,但是他們的作用範圍是不一樣的。下面我們結合SpringBoot啟動的JVM引數來詳細瞭解下。透過本文介紹,我們可以知道這兩個命令的具體使用方式。

ARG傳遞變數

ARG只在Dockerfile中生效,且在docker build階段生效,構建好的映象內不存在此環境變數。意味著在容器啟動後ARG定義的變數已經無效,如果想讓其生效,需要將其賦值給ENV。

此時透過ARG定義的變數OPTS,已經成功透過ENV環境變數作為java啟動引數。當然我們也可以在docker build --build-arg 傳遞ARG變數,此時將覆蓋dockerfile內部的ARG變數。

此時可以看到"-Xmx216m -Xms216m -Dspring.profiles.active=test"已經覆蓋dockerfile中的ARG變數。

ENV傳遞環境變數

Dockerfile中可以透過ENV來設定環境變數,並且可以在容器啟動後使用。

透過以上我們可以看出容器啟動後,在dockerfile中透過ENV定義的環境變數JAVA_OPTS已經被成功應用到java啟動命令中。

docker run -e傳遞環境變數

我們也可以使用docker run 啟動容器是,透過-e引數來傳遞變數,這時它會覆蓋Dockfile內部透過ENV定義的環境變數。

1.ENV定義變數

2.檢視容器內部環境變數

透過以上命令我們可以看到容器預設的環境變數,也可以透過"docker run -e"方式新增自定義環境變數:

此時我們看到透過JAVA_OPTS自定義的環境變數為'-Xmx256m -Xms256m -Dspring.profiles.active=test',已經覆蓋了ENV定義的環境變數,剩下的工作就是在容器內部來使用JAVA_OPTS 變數。

此時helloworld2容器並沒有正常啟動,報錯如下:

看來JAVA_OPTS並沒有接收到環境變數引數,而將其直接識別為字串$JAVA_OPTS,因此會被java啟動命令識別為class報錯,這是為什麼呢?

這就要從ENTRYPOINT的shell形式和exec形式說起,這兩種形式的區別在於exec形式不像shell那樣能夠呼叫環境變數,因此我們必須使用shell的形式。

此時我們啟動容器,可以看到正常訪問。由此我們得知透過docker run -e傳輸環境變數不能使用ENTRYPOINT的exec形式。

總結

透過本文的講解,我們熟悉了docker部署SpringBoot專案時如何傳遞JVM引數,同時觸類旁通,幫我們在後續應用上K8S 透過configmap或env環境變數傳遞引數做好準備。

來自 “ 木訥大叔愛運維 ”, 原文作者:三頁;原文連結:https://mp.weixin.qq.com/s/CbMYtypANA3Z55v3N8sXqg,如有侵權,請聯絡管理員刪除。

相關文章