Nexus3.34.0 Docker容器内执行jar命令提示command not found如何解决
问题原因
官方Nexus 3.34.0 Docker镜像默认仅预装Java运行环境(JRE),而jar是JDK专属的打包工具,JRE没有集成该命令,因此执行时会抛出找不到命令的错误。
可行解决方案
方案1:构建前临时安装JDK
在执行jar操作的RUN指令前,先安装OpenJDK,操作完成后可以清理安装包减小镜像体积。针对Nexus镜像使用的yum包管理器,命令如下:
# 先安装JDK RUN microdnf install -y java-11-openjdk-devel && \ # 执行原有jar操作逻辑 BASE_JAR=$(find /opt/sonatype/nexus/system/org/sonatype/nexus/nexus-base -name "nexus-base*.jar") && \ mkdir temp && cd temp && \ jar -xf $BASE_JAR static/css/nexus-content.css && \ echo ".nexus-header .product-spec { display:none }" >> static/css/nexus-content.css && \ jar uf $BASE_JAR static/css/nexus-content.css && \ cd .. && rm -rf temp && \ # 卸载JDK并清理缓存,减小镜像体积 microdnf remove -y java-11-openjdk-devel && \ microdnf clean all
该方案不需要改动原有操作逻辑,兼容性最好。
方案2:用unzip/zip替代jar命令
jar包本质是zip格式压缩包,可以用系统自带的zip/unzip工具完成解压、重打包操作,不需要额外安装体积更大的JDK:
# 先安装zip/unzip工具,占用空间远小于JDK RUN microdnf install -y unzip zip && \ BASE_JAR=$(find /opt/sonatype/nexus/system/org/sonatype/nexus/nexus-base -name "nexus-base*.jar") && \ mkdir temp && cd temp && \ # 用unzip替代jar -xf unzip $BASE_JAR static/css/nexus-content.css && \ echo ".nexus-header .product-spec { display:none }" >> static/css/nexus-content.css && \ # 用zip替代jar uf zip -u $BASE_JAR static/css/nexus-content.css && \ cd .. && rm -rf temp && \ # 清理工具和缓存 microdnf remove -y unzip zip && \ microdnf clean all
该方案构建出来的镜像体积更优,适合对镜像大小有要求的场景。
注意事项
- 操作完成后建议校验jar包的权限,确保和修改前一致,避免Nexus启动时出现权限不足的问题
- 如果是离线构建环境,可以提前把依赖的RPM包导入镜像再安装,无需走公网yum源
内容的提问来源于stack exchange,提问作者Ambati
相关产品推荐
相关产品推荐

