【问题标题】:How to make the ARTIFACT_NAME Dynamic?如何使 ARTIFACT_NAME 动态化?
【发布时间】:2021-11-05 05:23:30
【问题描述】:

在尝试创建 docker build 时,出现如下错误:

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

这是 docker 文件:

# 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。

【问题讨论】:

    标签: spring-boot docker dockerfile


    【解决方案1】:

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

    寻找通配符,docker build 处理不了。但是如果你不使用通配符,上面的// 效果很好。

    因此,对于您的情况,只需更改为 ENV APP_HOME=/usr/app 即可解决您的问题。

    Dockerfile:

    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
    

    补充,如果你将后端更改为BUILDKIT 像下一个,/usr/app/ 仍然可以工作,所以我猜这与 docker 实现问题有关:

    使用 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.0s
    

    【讨论】:

      猜你喜欢
      • 2014-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-22
      • 2019-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多