如何配置Spring Boot Maven插件从私有Nexus拉取JVM镜像?
问题场景
我们使用私有Nexus仓库存储Docker镜像,之前通过Dockerfile拉取JVM:
FROM docker-nexus.mycompany.tools/eclipse-temurin:17-jdk-alpine
现在改用Maven的spring-boot:build-image目标替代Dockerfile,已配置插件的builderRegistry和publishRegistry指向私有Nexus:
<groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <docker> <builderRegistry> <url>docker-nexus.mycompany.tools</url> ... 用户名密码 ... </builderRegistry> <publishRegistry> <url>docker-nexus.mycompany.tools</url> ... 用户名密码 ... </publishRegistry> </docker> </configuration>
但构建时仍尝试从GitHub下载JRE,被防火墙拦截:
[INFO] [creator] BellSoft Liberica JRE 17.0.12: Contributing to layer [INFO] [creator] Downloading from https://github.com/bell-sw/Liberica/releases/download/17.0.12+10/bellsoft-jre17.0.12+10-linux-amd64.tar.gz
查阅Paketo文档后发现现有buildpack均不支持私有Nexus,想知道是否能实现从私有Nexus拉取JVM镜像,还是必须回归Dockerfile?
解决方案
方法1:配置Paketo JVM Buildpack的自定义源(推荐)
你之前配置的builderRegistry仅用于拉取Paketo的builder镜像,而JVM包是由JVM Buildpack从上游源下载的,需要通过环境变量指定私有仓库地址:
- 先把对应版本的JVM包(比如eclipse-temurin的jdk/jre tar.gz)上传到私有Nexus的仓库中,比如路径为
https://docker-nexus.mycompany.tools/repository/jvm-packages/ - 修改Maven插件配置,添加环境变量指定JVM版本和私有仓库地址:
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <docker> <builderRegistry> <url>docker-nexus.mycompany.tools</url> <username>你的用户名</username> <password>你的密码</password> </builderRegistry> <publishRegistry> <url>docker-nexus.mycompany.tools</url> <username>你的用户名</username> <password>你的密码</password> </publishRegistry> </docker> <environment> <!-- 指定需要的JVM版本 --> <BP_JVM_VERSION>17</BP_JVM_VERSION> <!-- 指定私有Nexus上的JVM包仓库前缀 --> <BP_JVM_REPOSITORY>https://docker-nexus.mycompany.tools/repository/jvm-packages/</BP_JVM_REPOSITORY> </environment> </configuration> </plugin>
Buildpack会自动拼接版本号到仓库地址后,拉取对应的JVM包。
方法2:构建自定义Paketo Builder镜像
如果方法1无法满足需求,可以自己定制包含私有源配置的Builder:
- 克隆Paketo官方的Builder仓库,修改JVM Buildpack的配置文件,将默认的JVM源替换为你的私有Nexus地址
- 构建自定义Builder镜像并推送到私有Nexus仓库
- 在Spring Boot插件中指定使用这个自定义Builder:
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <image> <builder>docker-nexus.mycompany.tools/custom-paketo-builder:latest</builder> </image> <docker> <builderRegistry>...</builderRegistry> <publishRegistry>...</publishRegistry> </docker> </configuration> </plugin>
方法3:回归Dockerfile(备选)
如果上述两种方法都无法落地,回归Dockerfile是最稳妥的方案——你已经能通过Dockerfile成功拉取私有Nexus的JVM镜像,同时可以结合Spring Boot的dockerfile:build目标,保持Maven构建流程的一致性。
内容的提问来源于stack exchange,提问作者Alkis Mavridis
相关产品推荐
相关产品推荐

