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