用了“docker-maven-plugin"这个名字的,主流有两个插件能将maven项目(或模块)构建为docker镜像。
一个是fabric8io/docker-maven-plugin
,
GitHub地址:https://github.com/fabric8io/docker-maven-plugin
目前仍在持续维护更新。
另一个是 spotify/docker-maven-plugin
,
GitHub地址:https://github.com/spotify/docker-maven-plugin
已经停止维护更新,最后一次更新是2020年1月,目前是 Public archive状态。简体中文互联网看到的关于“docker-maven-plugin”的基本上都是用spotify/docker-maven-plugin
的。但是,spotfiy自己并不推荐用spotify/docker-maven-plugin
,而是推荐使用他们的spotify/dockerfile-maven
插件,GitHub地址是https://github.com/spotify/dockerfile-maven ,他们把这个项目的状态称为“mature”(成熟),而且早在2019年10月就已经不再更新了。
简中网的特点就是追求简单,能用就行,才不管你怎么推荐,也不追求最新。简中网的朋友们想到“我要把我的maven项目做成docker镜像”这个idea的时候,基本上就是百度“docker maven 插件”,于是,哒哒,spotify/docker-maven-plugin
出现在搜索结果里,不少人用过后觉得简单好用,自己也写了个博客记录一下,于是spotify/docker-maven-plugin
越发排在百度搜索结果的前面。spotify/docker-maven-plugin
符合简单、能用的特点,但是有很多缺陷/限制。spotify/dockerfile-maven
只是稍稍复杂一丢丢(要自己写Dockerfile),但是已经基本上没有什么缺陷/限制了,所以spotify认为它“mature”。但是,你让一个Java工程师去写Dockerfile?不如杀了他吧!
不受待见的fabric8io/docker-maven-plugin
虽然也支持自己写Dockerfile,但是他们可能也觉得让Java工程师去写Dockerfile太虐待人,于是他们虐待自己,实现了只需要在POM里写配置就能实现Dockerfile的全部功能的一整套POM配置,呃~~,他们也不是完全自己实现了所有POM配置,他们发现有另一个插件maven-assembly-plugin
能很好地将maven生成的文件编排为我所用,而生成docker镜像正好需要这样,所以借用了maven-assembly-plugin
一下下,除了支持在POM里写很多配置之外,还支持你再写一个docker-assembly.xml
文件,依然是xml格式的,不算虐待Java工程师。
本文的主角正是这个fabric8io/docker-maven-plugin
,在POM里有不少配置,也有docker-assembly.xml
文件,此外还用supervisord
来管理容器里的java程序,用startup.sh
作为容器启动的代码,上代码:
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>docker</artifactId>
<packaging>pom</packaging>
<parent>
<groupId>cn.wolfsoftstudio</groupId>
<artifactId>ycshop</artifactId>
<version>${ycshop-version}</version>
<relativePath>../pom.xml</relativePath>
</parent>
<dependencies>
<dependency>
<groupId>cn.wolfsoftstudio</groupId>
<artifactId>buyer</artifactId>
<version>${ycshop-version}</version>
</dependency>
<dependency>
<groupId>cn.wolfsoftstudio</groupId>
<artifactId>common</artifactId>
<version>${ycshop-version}</version>
</dependency>
<dependency>
<groupId>cn.wolfsoftstudio</groupId>
<artifactId>mq-consumer</artifactId>
<version>${ycshop-version}</version>
</dependency>
<dependency>
<groupId>cn.wolfsoftstudio</groupId>
<artifactId>im</artifactId>
<version>${ycshop-version}</version>
</dependency>
<dependency>
<groupId>cn.wolfsoftstudio</groupId>
<artifactId>manager</artifactId>
<version>${ycshop-version}</version>
</dependency>
<dependency>
<groupId>cn.wolfsoftstudio</groupId>
<artifactId>spring-boot-admin</artifactId>
<version>${ycshop-version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>${docker-maven-plugin-version}</version>
<configuration>
<images>
<image>
<name>${hub.docker.username}/ycshop-api:latest</name>
<build>
<from>openjdk:17-jdk-slim</from>
<tags>
<tag>latest</tag>
<tag>${project.version}</tag>
</tags>
<workdir>/app</workdir>
<assembly>
<targetDir>/app</targetDir>
<descriptor>${project.basedir}/docker-assembly.xml</descriptor>
</assembly>
<runCmds>
<run>apt-get update && apt-get install -y supervisor && rm -rf /var/lib/apt/lists/*</run>
<run>mkdir -p /var/log/supervisor</run>
<run>mkdir -p /etc/supervisor/conf.d/</run>
<run>mv /app/supervisord.conf /etc/supervisor/conf.d/supervisord.conf</run>
<run>chmod +x /app/startup.sh</run>
</runCmds>
<entryPoint>
<exec>
<arg>/usr/bin/supervisord</arg>
<arg>-c</arg>
<arg>/etc/supervisor/supervisord.conf</arg>
</exec>
</entryPoint>
</build>
</image>
</images>
</configuration>
</plugin>
</plugins>
</build>
</project>
docker-assembly.xml
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.2.0
http://maven.apache.org/xsd/assembly-2.2.0.xsd">
<moduleSets>
<moduleSet>
<!-- Enable access to all projects in the current multimodule build! -->
<useAllReactorProjects>true</useAllReactorProjects>
<!-- exclude the framework module -->
<excludes>
<exclude>cn.wolfsoftstudio:framework</exclude>
</excludes>
<binaries>
<includes>
<include>cn.wolfsoftstudio:*:jar</include>
</includes>
<excludes>
<exclude>cn.wolfsoftstudio:framework:jar</exclude>
</excludes>
<unpack>false</unpack>
<includeDependencies>false</includeDependencies>
<outputFileNameMapping>${module.artifactId}.${module.extension}</outputFileNameMapping>
</binaries>
</moduleSet>
</moduleSets>
<files>
<file>
<source>supervisord.conf</source>
</file>
<file>
<source>startup.sh</source>
</file>
</files>
</assembly>
supervisord.conf
[supervisord]
nodaemon=true
logfile=/var/log/supervisor/supervisord.log
pidfile=/var/run/supervisord.pid
[program:startup]
command=/app/startup.sh
startsecs=0
autostart=true
autorestart=false
[program:buyer]
command=java -jar /app/buyer.jar
autostart=false
autorestart=true
stderr_logfile=/var/log/buyer.err.log
stdout_logfile=/var/log/buyer.out.log
[program:common]
command=java -jar /app/common.jar
autostart=false
autorestart=true
stderr_logfile=/var/log/common.err.log
stdout_logfile=/var/log/common.out.log
[program:im]
command=java -jar /app/im.jar
autostart=false
autorestart=true
stderr_logfile=/var/log/im.err.log
stdout_logfile=/var/log/im.out.log
[program:mqconsumer]
command=java -jar /app/mq-consumer.jar
autostart=false
autorestart=true
stderr_logfile=/var/log/mq-consumer.err.log
stdout_logfile=/var/log/mq-consumer.out.log
[program:manager]
command=java -jar /app/manager.jar
autostart=false
autorestart=true
stderr_logfile=/var/log/manager.err.log
stdout_logfile=/var/log/manager.out.log
[program:seller]
command=java -jar /app/seller.jar
autostart=false
autorestart=true
stderr_logfile=/var/log/seller.err.log
stdout_logfile=/var/log/seller.out.log
[program:springboogadmin]
command=java -jar /app/spring-boot-admin.jar
autostart=false
autorestart=true
stderr_logfile=/var/log/spring-boot-admin.err.log
stdout_logfile=/var/log/spring-boot-admin.out.log
startup.sh
#!/bin/bash
sleep 60
supervisorctl start common
sleep 20
supervisorctl start buyer
sleep 20
supervisorctl start im
本来想一句一句口把口地解释一下代码的,最近忙,不了。有问题请参看官方文档:https://dmp.fabric8.io/
PS:听我一句劝,有问题,问AI,别百度,百度只是用来找到官方网站的(要仔细辨别哦)