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

请点击以下链接下载 Stable 或 Edge 版本的 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:8080 com.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>18@163.com</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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM