Процесс Heroku падает, как только процесс запускается

У меня есть простой сервер Micronaut, который я пытаюсь запустить на Heroku, создав его с помощью heroku.yml, но по какой-то причине, когда я проверяю журналы, процесс завершается, как только он начинается. Образ докера отлично работает локально, и в журналах больше ничего не печатается, поэтому я не могу понять, почему.

Вот мой докерфайл

FROM node as build-frontend
WORKDIR /app
COPY frontend/myfrontend/package.json .
COPY frontend/myfrontend/public ./public
COPY frontend/myfrontend/src ./src
RUN npm install .
RUN npm run build

FROM gradle:6.8.2-jre11 AS build-env
# Set the working directory to /home
WORKDIR /home
COPY --chown=gradle:gradle backend ./
COPY --from=build-frontend /app/build /home/src/main/resources/public
# Compile the application.
RUN ./gradlew assemble

FROM openjdk:11.0.10-jre-slim-buster
# Set the working directory to /home
WORKDIR /home
# Copy the compiled files over.
COPY --from=build-env /home/build/libs/myjar-0.1-all.jar /home/myjar.jar

# Starts the java app
# Using EntryPoing to pass env. variables as describe in this article
ENTRYPOINT exec java -XX:+UseContainerSupport -XX:MaxRAMPercentage=80.0 -noverify -XX:+AlwaysPreTouch -jar myjar.jar

Вот мой heroku.yml

setup:
  addons:
    - plan: heroku-postgresql
      as: DATABASE
build:
  docker:
    web: Dockerfile
run:
  web: "exec java -XX:+UseContainerSupport -XX:MaxRAMPercentage=80.0 -noverify -XX:+AlwaysPreTouch -jar myjar.jar"

и, наконец, мой Micronaut application.yml, который просто устанавливает некоторые конфиги

micronaut:
  application:
    name: mypackage
  router:
    static-resources:
      default:
        enabled: true
        paths:
        - classpath:public
        mapping: /**
  server:
    port: ${PORT:8080}
    cors:
      enabled: true

datasources:
  default:
    driverClassName: org.postgresql.Driver
    dbUrl: jdbc:postgresql://mydbhost.com:port/dbname?sslmode=require
    dbUsername: dbuser
    dbPassword: dbpasswd

  scan:
    packages: mypackage

netty:
  default:
    allocator:
      max-order: 3

Когда я просто делаю docker build -t test-image:latest . и docker run -p 80:8080 test-image:latest, я могу нормально подключиться к локальному хосту, а док-контейнер запускает сервер micronaut. Если по какой-то причине это не удается, я вижу вывод в журналах контейнера с подробным описанием причины. Когда я загружаю это в героку (через развертывание github), все, что я вижу в журналах, это

2023-01-09T22:25:50.145942+00:00 heroku[web.1]: Starting process with command `/bin/sh -c exec\ java\ -XX:\+UseContainerSupport\ -XX:MaxRAMPercentage\=80.0\ -noverify\ -XX:\+AlwaysPreTouch\ -jar\ myjar.jar`
2023-01-09T22:25:51.381760+00:00 heroku[web.1]: Process exited with status 0
2023-01-09T22:25:51.439962+00:00 heroku[web.1]: State changed from starting to crashed

Я пытался: Чтобы запустить его локально, подключенном к базе данных postgres надстройки heroku, все работает отлично. Максимально упростить сборку Удаление значения по умолчанию для порта (чтобы убедиться, что он получает $PORT) и запуск его локально с установленным параметром export PORT=8080 (работает просто отлично, док-контейнер выбирает порт env, как мы ожидаем в героку)

И я не могу понять, почему он сразу же закрывается на Heroku. отредактировано: изначально думал, что это связано со значением порта, но я понял, как дать micronaut порт через командную строку, и он все еще не работает на Heroku (работает локально)

редактировать: Я попытался изменить свой application.yml на это с жестко запрограммированной БД, и все равно ничего. Просто не работает. Приложение по-прежнему падает, и в журналах ничего не указано, почему

setup:
  config:
    PORT: $PORT
    MICRONAUT_SERVER_PORT: $PORT
build:
  docker:
    web: Dockerfile
run:
  web: "exec java -Dmicronaut.server.port=$PORT -XX:+UseContainerSupport -XX:MaxRAMPercentage=80.0 -noverify -XX:+AlwaysPreTouch -jar myjar.jar"

У меня до сих пор нет дополнительного вывода из Heroku. Никакой трассировки стека, stderr или stdout вообще.

Вы можете проверить журналы с помощью heroku logs?

kaiffeetasse 10.01.2023 09:10

Я проверил журналы heroku, и они пусты, за исключением «процесс запущен» и «процесс разбился» почти сразу после

Kilbo 10.01.2023 17:57
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
2
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ну, это не очень ответ. И ничто в документах Heroku не указывает мне, почему это работает, но удаление ENTRYPOINT exec java -XX:+UseContainerSupport -XX:MaxRAMPercentage=80.0 -noverify -XX:+AlwaysPreTouch -jar myjar.jar из моего Dockerfile работает. После удаления точки входа я снова вижу журналы и вижу запуск моего сервера micronaut. С ENTRYPOINT, определенным в моем файле Docker, я просто получаю то, о чем я писал выше: «Запуск процесса», за которым сразу же происходит сбой процесса.

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