使用maven插件構建docker鏡像

為什么要用插件

主要還是自動化的考慮,如果額外使用Dockerfile進行鏡像生成,可能會需要自己手動指定jar/war位置,并且打包和生成鏡像間不同步,帶來很多瑣碎的工作。

插件選擇

使用比較多的是spotify的插件:https://github.com/spotify/docker-maven-plugin
和 https://github.com/spotify/dockerfile-maven。
但這里我選擇另一款插件:https://github.com/fabric8io/docker-maven-plugin。
因為他文檔比較詳細,在使用上也比較方便。
文檔地址:https://dmp.fabric8.io/

示例

這里使用一個spring boot項目,只有一個最簡單的HelloController,如下:

@RestController
public class HelloController {@GetMapping("/")public String hello() {return "hello";}
}

pom.xml改動如下:

<plugin><groupId>io.fabric8</groupId><artifactId>docker-maven-plugin</artifactId><version>0.23.0</version><configuration><dockerHost>tcp://192.168.99.100:2376</dockerHost><certPath>C:\Users\fairjm\.docker\machine\machines\default</certPath><images><image><name>${project.name}:${project.version}</name><build><from>openjdk:8-jre</from><args><JAR_FILE>${project.name}-${project.version}.jar</JAR_FILE></args><assembly><descriptorRef>artifact</descriptorRef></assembly><entryPoint>["java"]</entryPoint><cmd>["-jar","maven/${project.name}-${project.version}.jar"]</cmd></build><run><ports><port>8888:8080</port></ports></run></image></images></configuration>
</plugin>

這里使用了在xml里寫操作而不是使用Dockerfile的方式,個人感覺這種方式更加簡單一點,不需要額外再維護一份文件,和Dockerfile相比使用的語法(注意entrypoint和cmd)也類似。

接下來介紹一下configuration配置。
dockerHostcertPath是連接docker使用,畢竟插件本身不包含docker和對應功能只是調用docker提供的API。
這兩個值在docker toolbox上可以通過docker-machine env獲得。

$ docker-machine env
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="C:\Users\fairjm\.docker\machine\machines\default"
export DOCKER_MACHINE_NAME="default"
export COMPOSE_CONVERT_WINDOWS_PATHS="true"
# Run this command to configure your shell:
# eval $("D:\Docker Toolbox\docker-machine.exe" env)

image的build指定了構建相關的設置:

  • name指定image名,這里使用了項目名,tag使用項目版本;
  • from指定基于的image,和Dockerfile的FROM一致;
  • args和ARG一致(在這個例子中沒有實際意義);
  • assembly用來定義哪些文件進入鏡像中,使用了插件已經定義好的行為,spring-boot生成的是fat jar不需要拷貝依賴所以選擇了artifact。這個的配置比較豐富,可以查看文檔獲取更多的信息。
  • entryPoint和cmd也對應同樣的Dockerfile命令。

接著通過mvn clean package docker:build執行打包和build

[INFO] --- maven-jar-plugin:2.6:jar (default-jar) @ docker-test ---
[INFO] Building jar: D:\sts_workspace\docker-test\target\docker-test-0.0.1-SNAPSHOT.jar
[INFO]
[INFO] --- spring-boot-maven-plugin:1.5.9.RELEASE:repackage (default) @ docker-test ---
[INFO]
[INFO] --- docker-maven-plugin:0.23.0:build (default-cli) @ docker-test ---
[INFO] Copying files to D:\sts_workspace\docker-test\target\docker\docker-test\0.0.1-SNAPSHOT\build\maven
[INFO] Building tar: D:\sts_workspace\docker-test\target\docker\docker-test\0.0.1-SNAPSHOT\tmp\docker-build.tar
[INFO] DOCKER> [docker-test:0.0.1-SNAPSHOT]: Created docker-build.tar in 1 second
[INFO] DOCKER> [docker-test:0.0.1-SNAPSHOT]: Built image sha256:303c3
[INFO] DOCKER> [docker-test:0.0.1-SNAPSHOT]: Removed old image sha256:ea8a7
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

完成打包,在對應連接的docker上也會出現這個鏡像:

$ docker image ls
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
docker-test                       0.0.1-SNAPSHOT      303c39c7d253        13 seconds ago      552MB

run指定了運行參數 這里將host的8888和容器的8080綁定,可以使用mvn docker:start啟動,訪問8888端口即可連接到服務器。
與其配對的是mvn docker:stop,可以停止并移除啟動的容器。

示例2

上述使用xml的配置方式,這里再簡單描述一下使用Dockerfile的配置方式。
在進行一些操作的時候,可以發現使用xml會有些問題,比如指令的執行順序。
該插件xml的執行順序和命令的定義順序不一定一致,可能會帶來一些問題,比如將<user>放于<runCmds>前但還是<runCmds>先觸發,一些需要root權限的命令就會失敗。
比如這個issus(但不確定是feature還是bug,感覺是feature):https://github.com/fabric8io/docker-maven-plugin/issues/913

這時候就需要直接使用Dockerfile來進行配置。
這里取一個實際的打成war的工程。
插件配置如下:

<images><image><name>${project.name}:${project.version}</name><build><assembly><descriptorRef>rootWar</descriptorRef></assembly><dockerFile>Dockerfile</dockerFile></build><run><ports><port>8888:8080</port></ports></run></image>
</images>

這里更改了descriptorRef,換成rootWar,這會將target下的項目war拷貝到maven\下并且取名為ROOT.war
Dockerfile默認放置的位置是src/main/docker,我們在這里建對應的文件:

FROM jetty
USER root
ENV JAVA_OPTIONS=-Xmx1g
RUN mkdir -p /root/xxx && touch /root/xxx/yyy && echo zz > /root/xxx/yyy
COPY maven/ /var/lib/jetty/webapps

基本和上面的配置類似,base image改為了jetty,查看jetty的Dockerfile可以發現他使用了一個新用戶jetty,使用這個用戶無法在root下建立目錄,并且由于項目本身之前使用sudo執行的,所以為了能正常運行選擇使用root用戶。
最后一步將ROOT.war拷貝到jetty的webapps目錄下。

關于maven/這個目錄,在打包后,會在target下生成target\docker\項目名\0.0.1-SNAPSHOT\build,對應的Dockerfilemaven\就在這個目錄下,實際執行的不是src/main/docker/Dockerfile,而是拷貝到上述目錄下的Dockerfile,此外使用xml的方式也是在這個位置生成了一份Dockerfile(USER 總是被放置于最后...)。

更多

本文簡要說明了使用fabric8的docker maven插件進行構建運行相關的操作,該插件還有其他的功能可以通過上面的文檔獲取幫助。

源碼下載(示例1)

https://github.com/fairjm/spring-boot-docker

轉載于:https://www.cnblogs.com/fairjm/p/docker_maven_springboot.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370129.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370129.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370129.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

windows下如何安裝pip以及如何查看pip是否已經安裝成功?

最近剛學習python&#xff0c;發現很多關于安裝以及查看pip是否安裝成的例子都比較老&#xff0c;不太適合于現在&#xff08;python 3.6 &#xff09;因此&#xff0c;下一個入門級別的教程。 0&#xff1a;首先如何安裝python我就不做介紹了。 1&#xff1a;如果安裝的是pyth…

檢查用戶顯示器的分辨率

檢查用戶顯示器的分辨率 轉載于:https://www.cnblogs.com/Renyi-Fan/p/8088012.html

android 字體 dpi,詳解Android開發中常用的 DPI / DP / SP

Android的碎片化已經被噴了好多年&#xff0c;隨著國內手機廠商的崛起&#xff0c;碎片化也越來越嚴重&#xff0c;根據OpenSignal的最新調查&#xff0c;2014年市面上有18796種不同的Android設備&#xff0c;作為開發者&#xff0c;一個無法回避的難題就是需要適配各種各樣奇奇…

android studio閃退代碼不報錯_代碼不報錯,不代表真的沒錯

今天是生信星球陪你的第695天大神一句話&#xff0c;菜鳥跑半年。我不是大神&#xff0c;但我可以縮短你走彎路的半年~就像歌兒唱的那樣&#xff0c;如果你不知道該往哪兒走&#xff0c;就留在這學點生信好不好~這里有豆豆和花花的學習歷程&#xff0c;從新手到進階&#xff0c…

Centos7操作系統部署指南

一、硬件環境&#xff1a; Dell R620 二、軟件環境&#xff1a; Centos6.4 X86_64 KVM Windows7vnc 三、安裝說明 操作系統更新之迅速&#xff0c;讓作為新手的系統運維人員有點措手不及&#xff0c;相對于老手就胸有成竹。怎么講&#xff1f;由于老手對技術方向把握的非常好&…

Eclipse插件中的SLF4J登錄

一直都在使用Maven和純Java庫進行開發&#xff0c;我從沒想過在開發Eclipse插件時發出一些日志語句可能會成為問題。 但是&#xff0c;在Eclipse開發人員的想象中&#xff0c;一切似乎總是在Eclipse環境中&#xff0c;而Eclipse宇宙之外則什么都沒有。 如果您使用Google搜索上…

CSS(四)

css元素溢出 當子元素的尺寸超過父元素的尺寸時&#xff0c;需要設置父元素顯示溢出的子元素的方式&#xff0c;設置的方法是通過overflow屬性來設置。 overflow的設置項&#xff1a; 1、visible 默認值。內容不會被修剪&#xff0c;會呈現在元素框之外。2、hidden 內容會被修…

mysql排名

轉載自思心思危http://www.cnblogs.com/zengguowang/p/5541431.html 一、sql1&#xff5b;不管數據相同與否&#xff0c;排名依次排序&#xff08;1,2,3,4,5,6,7.....&#xff09;&#xff5d; SELECTobj.user_id,   obj.score,  rownum : rownum 1 AS rownum FROM(SELECT…

python中變量名后的逗號_深入淺析python變量加逗號,的含義

逗號,用于生成一個長度為1的元組>>> (1)1>>> (1,)(1,)>>> 1,(1,)因此需要將長度為1的元組中元素提取出來可以用,簡化賦值操作>>> a(1,)>>> ba>>> b(1,)>>> b,a>>> b1最后print打印變量加,實現連續打印…

廣告的顯示和關閉

app或游戲的主頁顯示廣告頁面&#xff0c;實現方式&#xff1a; public class MainActivity extends Activity implements View.OnClickListener{private Button btnShowAd;private RelativeLayout layoutAd;Overrideprotected void onCreate(Bundle savedInstanceState) {supe…

android簽到功能模塊,基于android的課堂簽到系統.doc

基于android的課堂簽到系統本科畢業論文(設計)題 目 基于Android的課堂簽到系統學生姓名 XXX指導教師 XX學 院 信息科學與工程學院專業班級 計算機科學與技術0908班完成時間 2013年5月 摘 要在大學課堂中&#xff0c;簽到問題一直困擾著老師和同學們。傳統課堂簽到的手段大多是…

Java EE 7社區調查結果!

在JSR 342下可以繼續進行Java EE 7的工作。一切進展順利&#xff0c;Java EE 7現在處于“初稿審查”階段。 在11月初&#xff0c; Oracle發布了一個有關即將推出的Java EE 7功能的小型社區調查 。 昨天結果公布了。 超過1,100名開發人員參加了調查&#xff0c;并且幾乎對每個問…

CSS(三)

CSS盒子模型 盒子模型解釋 元素在頁面中顯示成一個方塊&#xff0c;類似一個盒子&#xff0c;CSS盒子模型就是使用現實中盒子來做比喻&#xff0c;幫助我們設置元素對應的樣式。盒子模型示意圖如下&#xff1a; 把元素叫做盒子&#xff0c;設置對應的樣式分別為&#xff1a;盒…

一道關于運行順序題

function foo(){   getName function(){console.log(1)}   return this } foo.getName function(){console.log(2)} foo.prototype.getName function(){console.log(3)} var getName function(){console.log(4)} function getName(){console.log(5)} foo.getName()//2 …

android+小米文件管理器源碼,小米開源文件管理器MiCodeFileExplorer-源碼研究(2)-2個單實例工具類...

從本篇開始&#xff0c;講解net.micode.fileexplorer.util工具包中的類。這個包下的類&#xff0c;功能也比較單一和獨立。很多代碼的思想和實現&#xff0c;可以用于JavaWeb和Android等多種環境中。一、單實例活動管理器ActivitiesManager一個單實例的活動管理器&#xff0c;從…

移動優先的響應式布局

前面的話 隨著移動互聯網的興起&#xff0c;不同設備的分辨率相差較大&#xff0c;如果在不同的設置上顯示同一個頁面&#xff0c;則用戶體驗差。響應式網頁設計是一種方法&#xff0c;使得一個網站能夠兼容多個終端&#xff0c;而不用為每個終端制作特定的版本。它使得一個網站…

python中英文字符和中文字符存儲長度不同_Django如何正確截取中英混合字符串及表單中限制中文字符中長度...

中文字符和英文字符所占的字節長度是不一樣&#xff0c;一個是2個字節&#xff0c;一個是1個字節&#xff0c;這給我們用英文的web框架開發中文app帶來了麻煩。比如Django自帶過濾器truncatewords并不支持截取中文&#xff0c;另外模型中CharField中的max_length選項用于限制中…

使用RESTful客戶端API進行GET / POST

互聯網上有很多如何使用RESTful Client API的東西。 這些是基礎。 但是&#xff0c;盡管該主題看起來微不足道&#xff0c;但仍然存在一些障礙&#xff0c;尤其是對于初學者而言。 在這篇文章中&#xff0c;我將嘗試總結我的專業知識&#xff0c;以及我如何在實際項目中做到這…

南昌互聯網行業協會籌辦者祝真和華罡團隊-2014年12月江西IDC排行榜

&#xfeff;&#xfeff;他出自軍營&#xff0c;擁有一身正氣。 他在南昌創業&#xff0c;立意卓越。 從站點開始、到微營銷、到線上教育&#xff0c;全面開花。 他在朋友圈看到不對的內容&#xff0c;就會即時批評。 他對朋友&#xff0c;又是很的和藹可親。 他就是南昌華罡網…

Linux下查看某個進程的網絡帶寬占用情況

說明&#xff1a; 1、可能查看某個進程的帶寬占用需要明確知道PID、進程名字、發送速度、接收速度。 2、很遺憾&#xff0c;在Linux原生的軟件中沒有這樣的一款&#xff0c;只能額外裝&#xff0c;最符合以上的情況就只有nethogs。 3、nethogs可以指定網卡&#xff0c;但是不能…