スプリング ブートを 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
butではないというヒントが見つかりました/cnb/process/web
。
Dockerfile の最後の行を更新して、このエントリポイントを選択します。
ENTRYPOINT /cnb/process/web
イメージを開始できます。わーい!:)
ただし、ライフサイクルランチャーでデフォルトのプロセスが使用されなくなったのはなぜだろうか?