ОШИБКА: не удалось запустить: определить команду запуска: при отсутствии процесса по умолчанию требуется команда

После обновления spring boot до 2.4 мы не можем запустить последний образ докера, который мы создали с помощью этого скрипта:

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

Хотя это нормально работало в весенней загрузке 2.3, теперь мы получаем эту ошибку после обновления до весенней загрузки 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'

Edit2:

Путем дальнейшего изучения различий изображений, созданных bootBuildImage с Spring-boot 2.3 и 2.4 я обнаружил подсказку, что по умолчанию ENTRYPOINT больше не /cnb/lifecycle/launcher но /cnb/process/web.

Обновляем последнюю строку нашего Dockerfile, чтобы выбрать эту точку входа:

ENTRYPOINT /cnb/process/web

позволяет нам запустить изображение! ура!:)

Однако я оставляю вопрос открытым, потому что мне все еще интересно, почему процесс по умолчанию больше не используется программой запуска жизненного цикла?!

2 ответа

Я обнаружил аналогичную проблему при определении функции Google Cloud.

Я чувствую, что вы забыли определитьentrypointдля вашей функции.

Вероятно, это связано с тем, что спецификация и, следовательно, жизненный цикл изменились во время обновления приложения для использования Spring Boot 2.4.

Ссылаться:

Сравнение проводится с версией 0.3, поскольку это запасной вариант, когда переменная средыCNB_PLATFORM_APIне установлен.

Другие вопросы по тегам