在 pom.xml 中结合 com.spotify:docker-maven-plugin 插件,可以实现通过 Maven 一键完成 Java 项目的构建、Docker 镜像打包及推送到仓库的流程。以下是具体配置和使用步骤:
一、插件依赖引入
<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 命令执行构建、打包镜像、推送流程:
-
仅构建镜像(不推送):bash
mvn clean package docker:build -
构建并推送镜像:bash
mvn clean package docker:build -DpushImage -
强制覆盖已有镜像(可选,需谨慎):bash
mvn clean package docker:build -DpushImage -Ddocker.forceTags=true
五、常见问题解决
- Docker 未启动:确保本地 Docker 服务已启动(
systemctl start docker或通过图形化工具启动)。 - 权限问题:若报
permission denied,将当前用户加入docker组(sudo usermod -aG docker $USER),重启后生效。 - 私有仓库未配置 HTTPS:若私有仓库使用 HTTP,需在 Docker 配置中添加信任(如
/etc/docker/daemon.json中添加"insecure-registries": ["私有仓库地址:端口"]),重启 Docker。 - 插件版本兼容:若使用高版本 Maven(如 3.8+),建议使用
1.2.2及以上版本插件,避免兼容性问题。 - 推送报错 [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 等自动发布系统中。
注意:本文归作者所有,未经作者允许,不得转载