spring 错误:无法启动:确定启动命令:当没有默认进程时,需要命令

3wabscal  于 2023-05-16  发布在  Spring
关注(0)|答案(1)|浏览(286)

在将Sping Boot 升级到2.4之后,我们无法运行通过此脚本创建的最终Docker镜像:

script:
    - echo $CI_JOB_TOKEN | docker login -u gitlab-ci-token --password-stdin $CI_REGISTRY
    - apk add openjdk11
    - ./gradlew bootBuildImage --imageName=$DOCKER_IMAGE_INTERMEDIATE
    - docker build -f ./docker/Dockerfile --build-arg base_image=$DOCKER_IMAGE_INTERMEDIATE -t $DOCKER_IMAGE_TAGGED .
    - docker push $DOCKER_IMAGE_TAGGED
    - docker tag $DOCKER_IMAGE_TAGGED $DOCKER_IMAGE_LATEST
    - docker push $DOCKER_IMAGE_LATEST

我们的Dockerfile只是创建了一个文件夹,然后chown将其发送给CNB用户:

# The base_image holds a reference to the image created by ./gradlew bootBuildImage
ARG base_image
FROM ${base_image}

ENV SOME_PATH /var/lib/some/files

USER root

RUN mkdir -p ${SOME_PATH}

RUN chown ${CNB_USER_ID}:${CNB_GROUP_ID} ${SOME_PATH}

USER ${CNB_USER_ID}:${CNB_GROUP_ID}

ENTRYPOINT /cnb/lifecycle/launcher

虽然这在spring Boot 2.3中工作得很好,但在升级到spring boot 2.4后,我们现在在尝试运行镜像时遇到了这个错误:

ERROR: failed to launch: determine start command: when there is no default process a command is required

编辑:

CI日志输出在bootBuildImage命令的末尾显示了以下行:

[creator]     Setting default process type 'web'

编辑2:

通过进一步检查bootBuildImage在spring-boot 2.3和2.4中创建的图像的差异,我发现了一个提示,即默认的ENTRYPOINT不再是/cnb/lifecycle/launcher,而是/cnb/process/web
更新Dockerfile的最后一行以选择此入口点:

ENTRYPOINT /cnb/process/web

使我们能够启动图像!yay!:)

但是,我保留这个问题,因为我仍然想知道为什么默认流程不再被生命周期启动器使用?!

ccrfmcuu

ccrfmcuu1#

我在定义Google Cloud Function时发现了类似的问题。
我的直觉是你忘了为你的函数定义一个entrypoint

相关问题