如何在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
相关产品推荐
相关产品推荐

