1. 程式人生 > 實用技巧 >SpringBoot 打包成Docker專案

SpringBoot 打包成Docker專案

一. 準備工作

idea 安裝docker外掛

進入到Idea-Preferences-Plugin-搜尋docker 點選Install 下載安裝成功後 重啟Idea。

idea配置docker

進入到Idea-Preferences-Build...Docker 配置docker

Engine API URL填寫docker的IP:2375即可(mac需要修改)

***配置docker地址的時候需要注意,遠端地址與本地地址都可以配置,但是後面建立docker映象時筆者遇到了很多問題,試了很多次才成功

筆者下面介紹自己成功的兩個案例。

***總結來看就是本地docker用dockerfile-maven-plugin容易成功

遠端docker用docker-maven-plugin容易成功,其他的總是出各種錯,由於能力,時間有限只成功了這兩種。

本地mac安裝配置docker

請點選以下連結下載StableEdge版本的 Docker for Mac。

如同 macOS 其它軟體一樣,安裝也非常簡單,雙擊下載的 .dmg 檔案,然後將鯨魚圖示拖拽到 Application 資料夾即可。

配置映象加速

設定docker外部訪問

外部訪問docker需要連結2375埠,由於mac本2375埠沒法直接連結,所以需要執行一個容器來開通外部訪問

docker run -d -v /var/run/docker.sock:/var/run/docker.sock -p 127.0.0.1:1234:1234 bobrik/socat TCP-LISTEN:1234,fork UNIX-CONNECT:/var/run/docker.sock

然後執行

export DOCKER_HOST=tcp://localhost:1234

遠端安裝配置docker

配置Docker,開啟遠端訪問(例:aliyun伺服器)

(注:僅供學習參考,實際生產環境萬萬不可,會產生很大的安全風險),預設埠是2375,也可以修改為其他埠

1、修改/lib/systemd/system/docker.service檔案

vim /lib/systemd/system/docker.service

ExecStart後面追加-H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock

2、重新載入配置檔案,重啟docker,使得剛才的配置生效

#重新載入配置檔案
systemctl daemon-reload
#重啟docker服務
systemctl restart docker

這樣就完成了準備工作,這些準備工作基本不會出什麼錯誤

二. 本地mac建立映象

pom檔案配置

dockerfile-maven-plugin

將 SpringBoot 專案打包成 Docker 映象,其主要通過 Maven plugin 外掛來進行構建。

接下來就看一下plugin外掛的配置和操作

<plugin>
  <groupId>com.spotify</groupId>
   <artifactId>dockerfile-maven-plugin</artifactId>
   <version>1.4.13</version>
   <configuration>
     <repository>com.uu.${project.artifactId}</repository>
     <tag>${project.version}</tag>
     <buildArgs>
       <JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
     </buildArgs>
   </configuration>
</plugin>

因為我是自己測試,為了可以手動控制就沒有在install階段就建立映象,所以plugin配置稍微簡單一些,如果像實現自動,可以新增下面的配置

<executions>
    <execution>
      <id>default</id>
<phase>install</phase> <goals> <goal>build</goal> <goal>push</goal> </goals> </execution>
</executions>

引數說明:

  • repository:指定Docker映象的repository名字,要展示在docker images 中的。
  • tag:指定Docker映象的tag,不指定tag預設為latest
  • buildArgs:指定一個或多個變數,傳遞給Dockerfile,在Dockerfile中通過ARG指令進行引用。
  • JAR_FILE 指定 jar 檔名。
  • goal:繫結dockerfile的build與push到maven階段
  • phase: 設定要繫結的階段,例如package,install

點選圖上的操作就可以自己手動來控制了,測試的時候更方便

Dockerfile

#設定映象基礎,jdk8
FROM java:8
#設定映象對外暴露埠
EXPOSE 8080
#ARG:引用plugin中配置的 JAR_FILE 檔案
ARG JAR_FILE
#將當前 target 目錄下的 jar 放置在根目錄下,命名為 app.jar,推薦使用絕對路徑。
ADD target/${JAR_FILE} /app.jar
#執行啟動命令
ENTRYPOINT ["java", "-jar","/app.jar"]

引數說明:

  • FROM:基於java:8映象構建
  • EXPOSE:監聽8080埠
  • ARG:引用plugin中配置的 JAR_FILE 檔案
  • ADD:將當前 target 目錄下的 jar 放置在根目錄下,命名為 app.jar,推薦使用絕對路徑。
  • ENTRYPOINT:執行命令 java -jar /app.jar

Dockerfile檔案一定要放在和pom.xml檔案一起的最外層目錄

自己遇到的一些坑

Failed to execute goal com.spotify:dockerfile-maven-plugin:1.4.13:build (default) on project docker_admin: Missing Dockerfile in context directory:

Dockerfile檔案放錯位置了會報著個錯誤

配置引數裡有個標籤

<dockerfile>/src/main/java/docker</dockerfile>

我把標籤對應上自己放檔案的位置,還是報

Failed to execute goal com.spotify:dockerfile-maven-plugin:1.4.13:build (default) on project docker_admin: Missing Dockerfile at /src/main/java/docker

我發現了一個問題,是不是應該寫全路徑呀,一直弄不明白,工資又泡湯了(*@︿@*﹀

<dockerfile>/Users/jingxc/service/sts-project/uu_boot_admin/src/main/java/docker</dockerfile>

改成這樣子試試(*@ο@*) 哇~ 然而又出現新的問題了

Execution default of goal com.spotify:dockerfile-maven-plugin:1.4.13:build failed: Could not acquire image ID or digest following build -> [Help 1]

太悲催了,這個問題智慧問度娘了,什麼都有,最多的就是修改.dockerignore 檔案內容:可是我沒有配置這個檔案呀,這可咋麼辦呢。。。。。。

還有人說重新裝一遍docker。。。。。

哎,在探索的路上越走越遠了,時間緊迫就不去深鑽了,頭髮都沒幾根了

最後還是放在最外面吧

不過,我測試的時候遇見了檔案放的位置沒問題,pom.xml配置也沒問題,就是報

Execution default of goal com.spotify:dockerfile-maven-plugin:1.4.13:build failed: Could not acquire image ID or digest following build -> [Help 1]

不知道怎麼回事,專案clean,重新整理依賴都不行,應該是Dockerfile出現問題了,但是我查了好多遍都沒問題,就幾行程式碼都快一個一個字看了,最後實在無奈

我只能把Dockerfile檔案刪除了,清空專案重新整理一下,又重新複製進去,就好了,就很神奇。

docker部署

通過命令列:docker run -di --name admin -p 8080:8080com.uu.docker_admin

當然本地有圖形化介面,可以直接啟動

啟動成功,新手村已經攻略,哈哈

三. 遠端aliyun建立映象

新手村已經攻略完成,準備去異界大陸,裝備就先不換了,只需要修改一下,idea外掛地址

進入到Idea-Preferences-Build...Docker 配置docker

嗯?什麼鬼好像有點水土不服,為什麼我配置上遠端的地址還是在我本地生成了映象,一定是有什麼結界,我先把自身的修為散去試試,關掉本地的docker服務試試

Caused by: com.spotify.docker.client.exceptions.DockerException: java.util.concurrent.ExecutionException: com.spotify.docker.client.shaded.javax.ws.rs.ProcessingException: java.io.IOException: Connection refused

連結被拒絕,看樣子還是沒有用到遠端的docker,哎北鼻無奈,只能學習強化技能了

pom檔案配置

利用docker-maven-plugin配置遠端的上傳地址

<plugin>
  <groupId>com.spotify</groupId>
   <artifactId>docker-maven-plugin</artifactId>
   <version>1.0.0</version>
   <configuration>
     <!--映象名稱-->
     <imageName>com.uu.${project.artifactId}</imageName>
     <!--指定dockerfile路徑-->
     <!--<dockerDirectory>${project.basedir}/src/main/resources</dockerDirectory>-->
     <!--指定標籤-->
     <imageTags>
       <imageTag>latest</imageTag>
     </imageTags>
     <!--遠端倉庫地址-->
     <!--<registryUrl>123.123.123.123:5000</registryUrl>-->
     <!--<pushImage>true</pushImage>-->
     <!--基礎映象jdk1.8-->
     <baseImage>java:8</baseImage>
     <!--製作者提供本人資訊-->
     <maintainer>[email protected]</maintainer>
     <!--切換到ROOT目錄-->
     <workdir>/ROOT</workdir>
     <cmd>["java","-version"]</cmd>
     <entryPoint>["java","-jar","${project.build.finalName}.jar"]</entryPoint>
     <!--指定遠端docker地址-->
     <dockerHost>http://123.123.123.123:2375</dockerHost>
     <!--這裡是複製jar包到docker容器指定目錄配置-->
     <resources>
       <resource>
          <targetPath>/ROOT</targetPath>
           <!--指定需要複製的根目錄,${project.build.directory}表示target目錄-->
           <directory>${project.build.directory}</directory>
           <!--用於指定需要複製的檔案,${project.build.finalName}.jar表示打包後的jar包檔案-->
           <include>${project.build.finalName}.jar</include>
        </resource>
     </resources>
  </configuration>
</plugin>

打包上傳成功

如果想實現自動化打包,那麼加上下面的配置就可以

<executions>
  <execution>
    <id>default</id>
    <phase>package</phase>
      <goals>
        <goal>build</goal>
      </goals>
  </execution>
</executions>

這裡也有坑

配置檔案裡有配置

<dockerDirectory>${project.basedir}/src/main/resources</dockerDirectory>
用這個配置一下,就用剛才寫好的Dockerfile,又出現問題了。。。。。

[ERROR] Failed to execute goal com.spotify:docker-maven-plugin:1.0.0:build (default-cli) on project docker_test: Exception caught: ADD failed: stat /var/lib/docker/tmp/docker-builder061031577/target: no such file or directory -> [Help 1]

出現這個問題有好多原因:

  • 沒有執行maven-package,未建立jar包
  • jar包名稱不對
  • jar包地址不對
  • Dockerfile檔案與jar不在同一目錄下
  • 不過上面說的都是基於專案檔案和docker環境在同一臺伺服器上的原因,比如自動化部署的時候,但是現在我的Dockerfile在本地,想部署到遠端

/var/lib/docker/tmp/docker-builder061031577/target這個路徑就太不對了,剛開始的時候一直以為是配置的問題,藏考了一些資料後來最終改成上面的配置

參考連結

https://www.cnblogs.com/niceyoo/p/13796792.html