在将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!:)
但是,我保留这个问题,因为我仍然想知道为什么默认流程不再被生命周期启动器使用?!
1条答案
按热度按时间ccrfmcuu1#
我在定义Google Cloud Function时发现了类似的问题。
我的直觉是你忘了为你的函数定义一个
entrypoint
。