在尝试创建docker生成时,会出现以下错误:
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这里是码头文件:
# 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}"]如果我们按下面的方式硬编码构建文件名,那么一切都很好:
# 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.。
发布于 2021-09-08 16:06:54
当您定义ENV APP_HOME=/usr/app/时,最终的COPY source变成了/usr/app//build/libs/*.jar。
它寻找通配符,码头建设不能很好地处理它。但是如果您不使用通配符,上面的//很好用。
因此,对于您的场景,只需更改为ENV APP_HOME=/usr/app就可以解决问题。
文档:
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}"]执行:
# 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执行:
# 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.0shttps://stackoverflow.com/questions/69103020
复制相似问题