You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Docker构建中动态设置ARTIFACT_NAME并正确拷贝jar构建产物

Docker构建报错修复方案

核心错误原因

  • 你原本的COPY指令同时使用通配符匹配源文件+指定目标文件名,Docker 对这种场景的通配符解析存在兼容性问题,若匹配到多个文件(比如Gradle同时生成业务jar和plain普通jar)时会直接识别不到有效源文件
  • 你写的ENTRYPOINT使用了exec数组格式,该格式不会自动解析环境变量,就算COPY成功也会出现启动找不到文件的报错

解决方案

修改最终镜像构建阶段的Dockerfile逻辑,先拷贝所有构建产物jar包,再在容器内执行重命名操作,同时修正ENTRYPOINT的环境变量解析逻辑即可实现动态配置,无需硬编码版本号:

# actual container
FROM adoptopenjdk/openjdk11:alpine-jre
ENV ARTIFACT_NAME=userservice.jar
ENV APP_HOME=/usr/app/
    
WORKDIR $APP_HOME
# 第一步:拷贝构建阶段生成的所有jar包到当前工作目录
COPY --from=TEMP_BUILD_IMAGE $APP_HOME/build/libs/*.jar ./
# 第二步:重命名匹配到的业务jar包为指定文件名
RUN mv ./*.jar ${ARTIFACT_NAME}
    
EXPOSE 8080
# 修正ENTRYPOINT写法,用shell格式正常解析环境变量
ENTRYPOINT java -Dspring.profiles.active=h2_db -jar ${ARTIFACT_NAME}

特殊场景补充

如果你的Gradle构建会同时生成带plain后缀的普通jar包和可执行jar包,导致通配符匹配到多个文件,可以将重命名命令修改为排除plain后缀的版本即可:

RUN mv $(ls ./*.jar | grep -v "plain.jar") ${ARTIFACT_NAME}

内容的提问来源于stack exchange,提问作者Gokul Nath KP

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 23:42:00