應用上K8S第一步:Dockerfile引數化構建技巧
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,如有侵權,請聯絡管理員刪除。
相關文章
- DockerFile構建映象Docker
- [Dockerfile構建映象]Docker
- Dockerfile - 引數與詳解Docker
- C技巧:結構體引數轉成不定引數結構體
- dockerfile構建flask環境DockerFlask
- Docker 映象構建之 DockerfileDocker
- 使用dockerfile構建nginx映象DockerNginx
- 預設建構函式、引數化建構函式、複製建構函式、解構函式函式
- Dockerfile技巧Docker
- 使用Dockerfile構建django專案DockerDjango
- 筆記:使用Dockerfile構建映象筆記Docker
- Android Gradle基於引數化配置實現差異化構建AndroidGradle
- Jenkins 2.32.3引數化構建maven專案-java專案JenkinsMavenJava
- 有手就行8——專案構建細節3-Jenkins的引數化構建Jenkins
- EXTJS 建構函式帶引數JS函式
- SOLIDWORKS軟體引數化建模配合技巧Solid
- Jenkins:引數化構建:分支|模組|回滾|列印日誌Jenkins
- Dockerfile 多階段構建實踐Docker
- 應用上K8S第三步:K8S整合Java應用K8SJava
- 使用Dockerfile構建一個django專案DockerDjango
- 從建構函式得到引數型別函式型別
- 應用上K8S第二步:Gradle 打包K8SGradle
- 應用上K8S第三步:Maven打包K8SMaven
- 關於 K8S 的持續化交付構建K8S
- 學習Jenkins持續整合(三)Jenkins專案構建觸發器、引數化構建及郵件傳送Jenkins觸發器
- 013、Dockerfile構建映象(2019-01-02 週三)Docker
- Prometheus之Dockerfile編寫、映象構建、容器啟動PrometheusDocker
- 建築師解構遊戲關卡——引數化關卡設計的思考遊戲
- Kotlin 主建構函式引數的修飾符Kotlin函式
- 再見 Dockerfile,擁抱新型映象構建技術 BuildpacksDockerUI
- pandas引數設定小技巧
- Metasploit設定VERBOSE引數技巧
- Metasploit設定HttpTrace引數技巧HTTP
- Metasploit設定LHOST引數技巧
- 在 Lua 中使用引數技巧
- 教你如何使用Springboot注入帶引數的建構函式Spring Boot函式
- 構建API的7個技巧API
- 構建Docker幾個小技巧Docker