docker-maven-plugin:自动构建Maven多模块的Docker镜像,并推送到Docker Registry或阿里云

简介: docker-maven-plugin:自动构建Maven多模块的Docker镜像,并推送到Docker Registry或阿里云

目录

docker-maven-plugin

基本介绍

使用手册

Maven Goals命令

Maven命令执行顺序

Skip Docker Goals Bound to Maven Phases(跳过)

Configuration

使用示例

注意事项(准备工作)

1. 有一台Docker daemon主机

2. Docker开启远程API

3. 配置DOCKER_HOST选项

4. 镜像仓库认证信息

pom.xml方式

Maven多模块工程

Pom配置-父工程

配置信息

Pom配置-子工程

编写Dockerfile文件制作镜像

前提:

docker images查看镜像

推送镜像-Docker Registry

Docker Registry 2.0搭建

Docker Registry 用户和密码配置

推送镜像-阿里云

异常场景

1. com.spotify:dockerfile-maven-plugin:1.4.10 not found

2. java.io.FileNotFoundException: \\.\pipe\docker_engine (系统找不到指定的文件。)

3.  repository element was not specified in the POM inside distributionManagement element or in -DaltDeploymentRepository=id::layout::url parameter

解决办法1 :

解决办法2 :



docker-maven-plugin

我们常见开源项目中使用的Docker Maven插件是com.spotify:docker-maven-plugin。可用版本信息见Github

通过其介绍可知该插件已经不再推荐使用,取而代之的是com.spotify:dockerfile-maven-pluginGithub地址

使用该插件可以在mvn命令中直接构建出Docker镜像和完成推送等。

dockerfile-maven-plugin要求用户必须提供Dockerfile用于构建镜像,从而将Docker镜像的构建依据统一到Dockerfile上,这与过时的docker-maven-plugin是不同的。


基本介绍

相比docker-maven-plugin更加灵活安全

也能够绑定 Docker 命令到 Maven 各生命周期


使用手册

Maven Goals命令

Goals available for this plugin:

Goal Description Default Phase
dockerfile:build Builds a Docker image from a Dockerfile. package
dockerfile:tag Tags a Docker image. package
dockerfile:push Pushes a Docker image to a repository. deploy


Maven命令执行顺序

mvn package
mvn dockerfile:build
mvn verify
mvn dockerfile:push
mvn deploy


Skip Docker Goals Bound to Maven Phases(跳过)

You can pass options to maven to disable the docker goals.

Maven Option What Does it Do? Default Value
dockerfile.skip Disables the entire dockerfile plugin; all goals become no-ops. false
dockerfile.build.skip Disables the build goal; it becomes a no-op. false
dockerfile.tag.skip Disables the tag goal; it becomes a no-op. false
dockerfile.push.skip Disables the push goal; it becomes a no-op. false

For example, to skip the entire dockerfile plugin:

mvn clean package -Ddockerfile.skip


Configuration

Build Phase

Maven Option What Does it Do? Required Default Value
dockerfile.contextDirectory Directory containing the Dockerfile to build. yes none
dockerfile.repository The repository to name the built image no none
dockerfile.tag The tag to apply when building the Dockerfile, which is appended to the repository. no latest
dockerfile.build.pullNewerImage Updates base images automatically. no true
dockerfile.build.noCache Do not use cache when building the image. no false
dockerfile.build.cacheFrom Docker image used as cache-from. Pulled in advance if not exist locally or pullNewerImage is false no none
dockerfile.buildArgs Custom build arguments. no none
dockerfile.build.squash Squash newly built layers into a single new layer (experimental API 1.25+). no false


使用示例

https://github.com/spotify/dockerfile-maven/tree/master/plugin/src/it


注意事项(准备工作)

该插件需要Java 7或更高版本以及Apache Maven 3或更高版本(dockerfile-maven-plugin <= 1.4.6需要Maven> = 3在其他情况下需要Maven> = 3.5.2)。

要运行集成测试或在实践中使用插件,需要有效的Docker设置。


1. 有一台Docker daemon主机

镜像的制作以及推送操作,都是由Docker来完成的,所以,必须要安装Docker环境。简单的说dockerfile-maven-plugin只是简化了直接操作Docker的复杂度,该是Docker完成的事情,还得由Docker来完成。

所以,明白这一点之后,就知道了并不是一定要在本地安装Docker环境,只要有Docker环境就可以了。


2. Docker开启远程API

Docker开启远程API


3. 配置DOCKER_HOST选项

要使用服务器的Docker环境,需要配置一个环境变量(默认情况下,插件是连接本地的Docker环境,即127.0.0.1)

环境变量的配置如下,改成你自己的服务器Docker环境即可(可能需要重启电脑):

DOCKER_HOST tcp://192.168.1.6:2375

标题


4. 镜像仓库认证信息

该插件构建和发布镜像依赖于镜像仓库,需要用户提供镜像仓库的登录信息,支持POM设置和Settings设置

具体参考:https://github.com/spotify/dockerfile-maven/blob/master/docs/authentication.md

pom.xml方式

从1.3.XX版开始,你可以使用pom本身的config进行身份验证。只需添加类似于以下内容的配置:

 <plugin>
    <groupId>com.spotify</groupId>
    <artifactId>dockerfile-maven-plugin</artifactId>
    <version>${version}</version>
    <configuration>
        <username>repoUserName</username>
        <password>repoPassword</password>
        <repository>${docker.image.prefix}/${project.artifactId}</repository>
        <buildArgs>
            <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
        </buildArgs>
    </configuration>
</plugin>

或者

 <plugin>
    <groupId>com.spotify</groupId>
    <artifactId>dockerfile-maven-plugin</artifactId>
    <version>${version}</version>
    <configuration>
        <repository>${docker.image.prefix}/${project.artifactId}</repository>
        <buildArgs>
            <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
        </buildArgs>
    </configuration>
</plugin>

然后使用命令

mvn goal -Ddockerfile.username=... -Ddockerfile.password=...


Maven多模块工程

Pom配置-父工程

               <!-- 构建和推动Docker镜像 -->
                <plugin>
                    <groupId>com.spotify</groupId>
                    <artifactId>dockerfile-maven-plugin</artifactId>
                    <version>${docker.maven.plugin.version}</version>
                    <executions>
                        <execution>
                            <id>default</id>
                            <goals>
                                <!--如果package时不想用docker打包,就注释掉这个goal-->
                                <goal>build</goal>
                                <goal>push</goal>
                            </goals>
                        </execution>
                    </executions>
                    <configuration>
                        <contextDirectory>${project.basedir}</contextDirectory>
                        <useMavenSettingsForAuth>true</useMavenSettingsForAuth>
                        <repository>${docker.repository.url}/${docker.registry.name}/${project.artifactId}</repository>
                        <username>${docker.registry.username}</username>
                        <password>${docker.registry.password}</password>
                        <tag>${project.version}</tag>
                        <buildArgs>
                            <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
                        </buildArgs>
                    </configuration>
                </plugin>


配置信息

        <!--Registry2仓库的地址,ip:port-->
        <!--<docker.repository.url>192.168.172.128:5000</docker.repository.url>-->
        <docker.repository.url>registry.cn-beijing.aliyuncs.com</docker.repository.url>
        <!--上传的Docker镜像前缀,此前缀一定要和Harbor中的项目名称一致,和阿里云仓库的命名空间一致-->
        <docker.registry.name>fly_jt</docker.registry.name>
        <docker.registry.username>XXX@sina.com</docker.registry.username>
        <docker.registry.password>XXX</docker.registry.password>
        <docker.maven.plugin.version>1.4.13</docker.maven.plugin.version>


Pom配置-子工程

            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>dockerfile-maven-plugin</artifactId>
                <configuration>
                    <tag>${project.version}</tag>
                </configuration>
            </plugin>


编写Dockerfile文件制作镜像

前提:

1. 要有环境变量DOCKER_HOST的配置

2. 要在子工程的目录下(与pom文件同级)创建一个Dockerfile文件

#设置镜像基础,jdk8
FROM java:8
#维护人员信息
MAINTAINER FLY
#设置镜像对外暴露端口
EXPOSE 8080
#将当前 target 目录下的 jar 放置在根目录下,命名为 app.jar,推荐使用绝对路径。
ADD target/devicemag-core-1.0.0.jar /devicemag-core-1.0.0.jar
#执行启动命令
ENTRYPOINT ["java", "-jar","/devicemag-core-1.0.0.jar"]

在父工程 , 执行mvn clean package 或者 mvn dockerfile:build 打包命令,即可制作镜像


docker images查看镜像

[root@localhost ~]# docker images
REPOSITORY                                                  TAG                 IMAGE ID       CREATED              SIZE
registry.cn-beijing.aliyuncs.com/fly_jt/devicemag-file      1.0.0               d09619501d27   11 seconds ago       643MB
registry.cn-beijing.aliyuncs.com/fly_jt/devicemag-system    1.0.0               9497ab784991   13 seconds ago       643MB
registry.cn-beijing.aliyuncs.com/fly_jt/devicemag-gateway   1.0.0               861d2577311b   16 seconds ago       643MB
registry.cn-beijing.aliyuncs.com/fly_jt/devicemag-auth      1.0.0               98ff94ed01d0   17 seconds ago       643MB
registry.cn-beijing.aliyuncs.com/fly_jt/devicemag-core      1.0.0               3defff63849a   About a minute ago   643MB
mysql                                                       5.7                 a70d36bc331a   2 weeks ago          449MB
redis                                                       5                   e35748fd6a72   3 weeks ago          98.4MB
portainer/portainer-ce                                      latest              980323c8eb3f   4 weeks ago          196MB
registry.cn-beijing.aliyuncs.com/fly_jt/portainer-ce        2.0.1               980323c8eb3f   4 weeks ago          196MB
registry                                                    2                   678dfa38fcfa   7 weeks ago          26.2MB
nacos/nacos-server                                          1.3.0               d1f1facebfbc   8 months ago         756MB
rabbitmq                                                    3.7.15-management   f05c3eb3cf91   19 months ago        179MB
java                                                        8                   d23bdf5b1b1b   4 years ago          643MB
[root@localhost ~]# 


推送镜像-Docker Registry

Docker Registry 2.0搭建

docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry2 registry:2

[root@localhost ~]# docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry2 registry:2
cba73bc3417883d68d1d47c17e48bc62b0ca8705b1a2532be4f1f8c0f659db45
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE                                      COMMAND                  CREATED         STATUS                PORTS                                                                                                                                         NAMES
cba73bc34178   registry:2                                 "/entrypoint.sh /etc…"   6 seconds ago   Up 2 seconds          0.0.0.0:5000->5000/tcp, :::5000->5000/tcp                                                                                                     registry2


启动验证

1、列出所有镜像

# curl http://192.168.172.128:5000/v2/_catalog

2、查看指定镜像都有哪些tag

# curl http://192.168.172.128:5000/v2/镜像名/tags/list


Docker Registry 用户和密码配置

容器运行成功,直接使用docker login 192.168.172.128:5000命令,输入Username和Password

我这里设置的是

用户名: test

密码:test


用户和密码base64

[root@localhost ~]# echo Hello World | base64^C
[root@localhost ~]# echo test:test | base64 
dGVzdDp0ZXN0Cg==
[root@localhost ~]# echo dGVzdDp0ZXN0Cg== | base64 -d
test:test

然后再  /.docker/config.json 添加如下内容

{undefined

   "auths": {undefined

       "192.168.172.128:5000": {undefined

           "auth": "dGVzdDp0ZXN0"

       }

   }

}

[root@localhost ~]# docker login 192.168.172.128:5000
Username: test
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
[root@localhost ~]# cat ~/.docker/config.json
{
  "auths": {
    "192.168.172.128:5000": {
      "auth": "dGVzdDp0ZXN0"
    }
  }
}

参考上面在父工程Pom中指定 repository 、username、password


推送镜像-阿里云

阿里云镜像仓库:拉取和推送Docker镜像

同时 参考上面在父工程Pom中指定 repository 、username、password

推送镜像-阿里云

在子工程 , 执行mvn deploy或者 mvn dockerfile:push 命令,即推送镜像


异常场景

1. com.spotify:dockerfile-maven-plugin:1.4.10 not found

在Maven配置文件settings.xml中添加

  <pluginGroups>
    <!-- pluginGroup
     | Specifies a further group identifier to use for plugin lookup.
    <pluginGroup>com.your.plugins</pluginGroup>
    -->
  <pluginGroup>com.spotify</pluginGroup>
  </pluginGroups>


2. java.io.FileNotFoundException: \\.\pipe\docker_engine (系统找不到指定的文件。)

[ERROR] Failed to execute goal com.spotify:dockerfile-maven-plugin:1.4.13:build (default) on project devicemag-core: Could not build image: java.util.concurrent.ExecutionException: com.spotify.docker.client.shaded.javax.ws.rs.ProcessingException: java.io.FileNotFoundException: \\.\pipe\docker_engine (系统找不到指定的文件。) -> [Help 1]

要使用服务器的Docker环境,需要配置一个环境变量(默认情况下,插件是连接本地的Docker环境,即127.0.0.1)

环境变量的配置如下,改成你自己的服务器Docker环境即可(可能需要重启电脑):

DOCKER_HOST tcp://192.168.1.6:2375

标题


3.  repository element was not specified in the POM inside distributionManagement element or in -DaltDeploymentRepository=id::layout::url parameter

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy (default-deploy) on project devicemag-core: Deployment failed: repository element was not specified in the POM inside distributionManagement element or in -DaltDeploymentRepository=id::layout::url parameter -> [Help 1]

需要注意的是,如果你没有配置部署artifact的maven repository,请不要使用mvn deploy命令,因为它会执行maven-deploy-plugin的deploy目标,而由于没有配置要部署的远程maven repository,会报类似如上的错。


解决办法1 :

在pom.xml中,应该将distributionManagement配置添加到要部署的位置。

<distributionManagement>
       <repository>
         <id>internal.repo</id>
         <name>Internal repo</name>
         <url></url>
       </repository>
   </distributionManagement>

可以在部署期间使用以下命令添加另一个位置(但为了避免出现上述错误,应至少配置一个存储库):


解决办法2 :

使用 mvn dockerfile:push 命令


相关实践学习
通过ACR快速部署网站应用
本次实验任务是在云上基于ECS部署Docker环境,制作网站镜像并上传至ACR镜像仓库,通过容器镜像运行网站应用,网站运行在Docker容器中、网站业务数据存储在Mariadb数据库中、网站文件数据存储在服务器ECS云盘中,通过公网地址进行访问。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
7月前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
2171 10
|
8月前
|
Java jenkins 应用服务中间件
结合Jenkins与Tomcat,实施Maven项目的自动构建和部署流程。
任何项目构建和部署的自动化流程,总离不开对各个环节精细把控与密切配合。涉及到源代码管理、构建工具、持续集成服务器以及最终的运行时环境的协调。通过上述简洁实用的步骤,可以实现Maven项目从源代码到运行状态的无缝过渡,进而提升软件开发的效率与质量。
426 0
|
Java Linux C语言
《docker基础篇:2.Docker安装》包括前提说明、Docker的基本组成、Docker平台架构图解(架构版)、安装步骤、阿里云镜像加速、永远的HelloWorld、底层原理
《docker基础篇:2.Docker安装》包括前提说明、Docker的基本组成、Docker平台架构图解(架构版)、安装步骤、阿里云镜像加速、永远的HelloWorld、底层原理
1047 90
|
安全 持续交付 云计算
课时5:阿里云容器服务:最原生的集成Docker和云服务
阿里云容器服务以服务化形式构建容器基础设施,大幅提升开发效率,简化应用部署流程。通过Docker容器和DevOps工具(如Jenkins),实现自动化部署与迭代,优化企业内部复杂部署问题。该服务支持GPU调度、混合云架构无缝迁移,并与阿里云产品体系无缝集成,提供安全防护、网络负载均衡等多重功能支持。凭借微服务架构,帮助企业突破业务瓶颈,提高资源利用率,轻松应对海量流量。
441 0
课时5:阿里云容器服务:最原生的集成Docker和云服务
|
Java jenkins 持续交付
Centos7下docker的jenkins下载并配置jdk与maven
通过上述步骤,您将成功在CentOS 7上的Docker容器中部署了Jenkins,并配置好了JDK与Maven,为持续集成和自动化构建打下了坚实基础。
1190 1
|
敏捷开发 API 持续交付
阿里云云效产品使用问题之流水线编译docker时,如何把已经定义好的token传入编译参数
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
阿里云云效产品使用问题之流水线编译docker时,如何把已经定义好的token传入编译参数
|
存储 Docker 容器
阿里云私有docker仓库构建海外镜像
【8月更文挑战第25天】
1082 3
|
关系型数据库 MySQL 应用服务中间件
配置docker阿里云镜像地址
配置docker阿里云镜像地址
|
存储 运维 数据安全/隐私保护
如何高效利用阿里云Docker镜像仓库管理您的容器镜像
如何高效利用阿里云Docker镜像仓库管理您的容器镜像