首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使ARTIFACT_NAME动态化?

如何使ARTIFACT_NAME动态化?
EN

Stack Overflow用户
提问于 2021-09-08 12:20:53
回答 1查看 154关注 0票数 1

在尝试创建docker生成时,会出现以下错误:

代码语言:javascript
复制
Status: Downloaded newer image for adoptopenjdk/openjdk11:alpine-jre
 ---> fcb7960593e0
Step 13/18 : ENV ARTIFACT_NAME=userservice.jar
 ---> Running in f9cb2c5751ce
Removing intermediate container f9cb2c5751ce
 ---> a8d457c0023a
Step 14/18 : ENV APP_HOME=/usr/app/
 ---> Running in 4376cb0c3120
Removing intermediate container 4376cb0c3120
 ---> 6df0ab62c566
Step 15/18 : WORKDIR $APP_HOME
 ---> Running in e44347ce7a6b
Removing intermediate container e44347ce7a6b
 ---> ac63acfe40e6
Step 16/18 : COPY --from=TEMP_BUILD_IMAGE $APP_HOME/build/libs/*.jar ${ARTIFACT_NAME}
COPY failed: no source files were specified
ERROR
ERROR: build step 0 "gcr.io/cloud-builders/docker" failed: step exited with non-zero status: 1

这里是码头文件:

代码语言:javascript
复制
# using multistage docker build
# ref: https://docs.docker.com/develop/develop-images/multistage-build/
    
# temp container to build using gradle
FROM gradle:6.9.1-jdk11 AS TEMP_BUILD_IMAGE
ENV APP_HOME=/usr/app/
WORKDIR $APP_HOME
COPY build.gradle settings.gradle $APP_HOME
  
COPY gradle $APP_HOME/gradle
COPY --chown=gradle:gradle . /home/gradle/src
USER root
RUN chown -R gradle /home/gradle/src
    
RUN gradle build || return 0
COPY . .
RUN gradle clean build
    
# actual container
FROM adoptopenjdk/openjdk11:alpine-jre
ENV ARTIFACT_NAME=userservice.jar <--- Here (fails)
ENV APP_HOME=/usr/app/
    
WORKDIR $APP_HOME
COPY --from=TEMP_BUILD_IMAGE $APP_HOME/build/libs/*.jar ${ARTIFACT_NAME} <--- Here (fails)
    
EXPOSE 8080
ENTRYPOINT ["java", "-Dspring.profiles.active=h2_db", "-jar", "${ARTIFACT_NAME}"]

如果我们按下面的方式硬编码构建文件名,那么一切都很好:

代码语言:javascript
复制
# actual container
FROM adoptopenjdk/openjdk11:alpine-jre
ENV ARTIFACT_NAME=userservice-0.0.2-SNAPSHOT.jar <--- Here (works)
ENV APP_HOME=/usr/app/
    
WORKDIR $APP_HOME
COPY --from=TEMP_BUILD_IMAGE $APP_HOME/build/libs/$ARTIFACT_NAME .  <--- Here (works)

如何将最新的构建工件复制为特定的名称?在上述情况下,应该选择userservice-0.0.2-SNAPSHOT.jar作为userservice.jar.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-08 16:06:54

当您定义ENV APP_HOME=/usr/app/时,最终的COPY source变成了/usr/app//build/libs/*.jar

它寻找通配符,码头建设不能很好地处理它。但是如果您不使用通配符,上面的//很好用。

因此,对于您的场景,只需更改为ENV APP_HOME=/usr/app就可以解决问题。

文档:

代码语言:javascript
复制
FROM gradle:6.9.1-jdk11 AS TEMP_BUILD_IMAGE
ENV APP_HOME=/usr/app/
WORKDIR $APP_HOME
RUN mkdir -p build/libs; cd build/libs; touch userservice-0.0.2-SNAPSHOT.jar

FROM adoptopenjdk/openjdk11:alpine-jre
ENV ARTIFACT_NAME=userservice.jar
#ENV APP_HOME=/usr/app/
ENV APP_HOME=/usr/app

WORKDIR $APP_HOME
COPY --from=TEMP_BUILD_IMAGE $APP_HOME/build/libs/*.jar ${ARTIFACT_NAME}

EXPOSE 8080
ENTRYPOINT ["java", "-Dspring.profiles.active=h2_db", "-jar", "${ARTIFACT_NAME}"]

执行:

代码语言:javascript
复制
# docker build . --no-cache
Sending build context to Docker daemon  2.048kB
......
Step 9/11 : COPY --from=TEMP_BUILD_IMAGE $APP_HOME/build/libs/*.jar ${ARTIFACT_NAME}
 ---> d9a7219be751
Step 10/11 : EXPOSE 8080
 ---> Running in df81e955b4b9
Removing intermediate container df81e955b4b9
 ---> c3f019d65533
Step 11/11 : ENTRYPOINT ["java", "-Dspring.profiles.active=h2_db", "-jar", "${ARTIFACT_NAME}"]
 ---> Running in 7c62bf624cb1
Removing intermediate container 7c62bf624cb1
 ---> e5377e14375d
Successfully built e5377e14375d

附加,如果您像next一样将后端更改为BUILDKIT,那么/usr/app/仍然可以工作,因此我猜这与对接器实现问题有关:

用buildkit执行

代码语言:javascript
复制
# DOCKER_BUILDKIT=1 docker build --progress=plain . --no-cache
......
#10 [stage-1 3/3] COPY --from=TEMP_BUILD_IMAGE /usr/app//build/libs/*.jar us...
#10 DONE 0.1s

#11 exporting to image
#11 exporting layers 0.0s done
#11 writing image sha256:730755ba444c13f289614b64d5cfd3be900b94c8d668307477ed2908183df14f
#11 writing image sha256:730755ba444c13f289614b64d5cfd3be900b94c8d668307477ed2908183df14f done
#11 DONE 0.0s
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69103020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档