Heroku进程一启动就崩溃

lztngnrs  于 2023-01-17  发布在  其他
关注(0)|答案(1)|浏览(130)
    • bounty将在7天后过期**。回答此问题可获得+50声望奖励。Kilbo希望引起更多人对此问题的关注:希望了解为什么我的heroku服务器不工作

我有一个简单的Micronaut服务器,我试图在Heroku上启动它,用heroku.yml构建它,但由于某种原因,当我检查日志时,进程一启动就退出了。Docker映像在本地运行得很好,日志中没有打印出任何其他内容,所以我找不到原因。
这是我的Dockerfile

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应用程序. 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时,我可以在localhost上连接得很好,docker容器运行micronaut服务器。如果由于某种原因失败,我会在容器日志中看到详细说明原因的输出。当我将其上传到heroku(通过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

我试过:要在本地连接到heroku addon postgres数据库运行它,工作正常尽可能地简化构建,删除端口上的默认值(以确保它拾取$PORT),并在本地运行它,设置export PORT = 8080(工作正常,docker container拾取env端口,就像我们在heroku中期望的那样)
我不明白为什么它会立即退出Heroku。编辑:我最初认为这与端口值有关,但我知道如何通过命令行给micronaut一个端口,它仍然不能在Heroku上工作(在本地工作)
编辑:我尝试改变我的应用程序。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的额外输出。根本没有stacktrace或stderr或stdout。

7tofc5zh

7tofc5zh1#

好吧,这并不是一个很好的答案。Heroku文档中没有任何东西能告诉我为什么这样做,但是从我的Dockerfile中删除ENTRYPOINT exec java -XX:+UseContainerSupport -XX:MaxRAMPercentage=80.0 -noverify -XX:+AlwaysPreTouch -jar myjar.jar是有效的。删除入口点后,我再次看到日志,可以看到我的micronaut服务器正在启动。在我的Dockerfile中定义ENTRYPOINT后,我只会得到我上面发布的“进程启动”,然后立即出现进程崩溃

相关问题