docker-maven-plugin总结

docker-maven-plugin总结

用了“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 &amp;&amp; apt-get install -y supervisor &amp;&amp; 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,别百度,百度只是用来找到官方网站的(要仔细辨别哦)