After upgrading spring boot to 2.4 we cannot run the final docker image that we create via this script:
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
our Dockerfile
just creates a folder and chown
s it to the CNB
user:
# 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
While this worked fine in spring boot 2.3, we now get this error after upgrading to spring boot 2.4 when trying to run the image:
ERROR: failed to launch: determine start command: when there is no default process a command is required
Edit:
The CI log output shows this line at the end of the bootBuildImage
command:
[creator] Setting default process type 'web'
Edit2:
By further inspecting the differences of the images created by bootBuildImage
with spring-boot 2.3 and 2.4 I found a hint that the default ENTRYPOINT
no longer is /cnb/lifecycle/launcher
but /cnb/process/web
.
Updating the last line of our Dockerfile to select this entrypoint:
ENTRYPOINT /cnb/process/web
enables us to start the image! yay! :)
However, I leave the question open, because I still wonder why the default process is no longer used by the lifecycle launcher?!
This is likely because the specification, and therefore the lifecycle, changed in the time the application was upgraded to use spring boot 2.4
Refer:
The comparison is with v0.3 because that's the fallback when the environment variable
CNB_PLATFORM_API
is not set.