_

pom.xml使用com.spotify一键打包推送

航仔 14天前 ⋅ 72 阅读

在 pom.xml 中结合 com.spotify:docker-maven-plugin 插件,可以实现通过 Maven 一键完成 Java 项目的构建、Docker 镜像打包及推送到仓库的流程。以下是具体配置和使用步骤:

一、插件依赖引入

在 pom.xml 的 <build><plugins> 中添加 docker-maven-plugin 依赖(注意版本适配,最新版可参考 Maven 中央仓库):
<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>1.4.13</version> <!-- 最新版本 -->
    <configuration>
        <!-- 1. 配置Docker镜像名称(格式:仓库地址/项目名:版本号) -->
        <!-- 若推送至Docker Hub:docker.io/用户名/项目名:${project.version} -->
        <!-- 若推送至私有仓库:私有仓库地址:端口/项目名:${project.version} -->
        <imageName>${docker.registry}/${project.artifactId}:${project.version}</imageName>
        
        <!-- 2. 指定Dockerfile路径(默认在项目根目录,若在src/main/docker则需配置) -->
        <dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
        
        <!-- 3. 配置构建上下文(默认项目根目录,可指定子目录) -->
        <buildContext>${project.basedir}</buildContext>
        
        <!-- 4. 配置Docker仓库认证(推送时需要) -->
        <serverId>docker-registry</serverId> <!-- 对应settings.xml中的server id -->
        
        <!-- 5. 可选:构建参数(如JAR包路径,与Dockerfile中的ARG配合) -->
        <buildArgs>
            <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
        </buildArgs>
    </configuration>
    
    <!-- 可选:绑定Maven生命周期(如package时自动构建镜像) -->
    <executions>
        <execution>
            <id>build-image</id>
            <phase>package</phase> <!-- 打包时自动构建镜像 -->
            <goals>
                <goal>build</goal>
            </goals>
        </execution>
    </executions>
</plugin>

二、配置 Docker 仓库认证

为了让插件能推送镜像到仓库(Docker Hub 或私有仓库),需要在 Maven 的 settings.xml 中配置仓库认证信息(通常位于 ~/.m2/settings.xml 或 {Maven安装目录}/conf/settings.xml):
<servers>
    <!-- 与pom.xml中<serverId>保持一致 -->
    <server>
        <id>docker-registry</id>
        <username>你的仓库用户名</username>
        <password>你的仓库密码/令牌</password>
        <!-- 若为私有仓库,需指定仓库地址(可选,部分场景需要) -->
        <!-- <configuration>
            <email>你的邮箱</email>
        </configuration> -->
    </server>
</servers>
  • 若推送至 Docker Hub:用户名 / 密码为 Docker Hub 账号密码(推荐使用 访问令牌 替代密码)。
  • 若推送至 私有仓库:用户名 / 密码为私有仓库的认证信息,imageName 需包含私有仓库地址(如 192.168.1.100:5000/myapp:1.0)。

三、编写 Dockerfile

确保 Dockerfile 与 pom.xml 中 <dockerDirectory> 配置的路径一致(例如 src/main/docker/Dockerfile),示例内容:
# 基础镜像(Java版本与项目匹配)
FROM openjdk:17-jdk-slim

# 接收Maven传递的JAR包路径参数
ARG JAR_FILE

# 将JAR包复制到容器中(重命名为app.jar)
COPY ${JAR_FILE} app.jar

# 暴露端口(与项目端口一致)
EXPOSE 8080

# 启动命令
ENTRYPOINT ["java", "-jar", "/app.jar"]

四、一键打包并推送镜像

通过 Maven 命令执行构建、打包镜像、推送流程:
  1. 仅构建镜像(不推送):
    bash
    mvn clean package docker:build
    
  2. 构建并推送镜像
    bash
    mvn clean package docker:build -DpushImage
    
     
  3. 强制覆盖已有镜像(可选,需谨慎):
    bash
    mvn clean package docker:build -DpushImage -Ddocker.forceTags=true
    

五、常见问题解决

  1. Docker 未启动:确保本地 Docker 服务已启动(systemctl start docker 或通过图形化工具启动)。
  2. 权限问题:若报 permission denied,将当前用户加入 docker 组(sudo usermod -aG docker $USER),重启后生效。
  3. 私有仓库未配置 HTTPS:若私有仓库使用 HTTP,需在 Docker 配置中添加信任(如 /etc/docker/daemon.json 中添加 "insecure-registries": ["私有仓库地址:端口"]),重启 Docker。
  4. 插件版本兼容:若使用高版本 Maven(如 3.8+),建议使用 1.2.2 及以上版本插件,避免兼容性问题。
  5. 推送报错 [ERROR] unauthorized: unauthorized to access repository: xx/xx, action: push: unauthorized to access repository: xx/xx, action: push
    (在C:\Users\自己用户\.docker\config.json中配置登陆信息)
    "auths": {
      "harbor.xx.com": {
        "auth":"账号:密码(使用base64加密后放这里)"
      }
    }​
通过以上配置,即可实现通过 Maven 命令一键完成从代码构建到 Docker 镜像推送的全流程,适合集成到 Jenkins、GitLab CI 等自动发布系统中。

全部评论: 0

    我有话说: