使用maven插件构建docker镜像

Posted fairjm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用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配置。
dockerHostcertPath是连接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,可以停止并移除启动的容器。

更多

本文简要说明了使用fabric8的docker maven插件进行构建运行相关的操作,该插件还有其他的功能可以通过上面的文档获取帮助。

源码下载

https://github.com/fairjm/spring-boot-docker












以上是关于使用maven插件构建docker镜像的主要内容,如果未能解决你的问题,请参考以下文章

使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上

使用maven插件构建docker镜像

docker使用docker-maven-plugin插件构建docker镜像

基于jib-maven-plugin快速构建微服务docker镜像

Docker-通过docker-maven-plugin插件实现docker镜像构建并自动发布到远程docker服务器

maven构建docker镜像三部曲之二:编码和构建镜像