日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用maven插件构建docker镜像

發布時間:2023/12/1 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用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配置。
dockerHost和certPath是連接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,對應的Dockerfile和maven\就在這個目錄下,實際執行的不是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

總結

以上是生活随笔為你收集整理的使用maven插件构建docker镜像的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。