当进程开始时,Heroku 进程崩溃。

4
我有一个简单的Micronaut服务器,我正在尝试使用heroku.yml构建并在Heroku上启动它,但出于某种原因,当我检查日志时,该进程会在启动后立即退出。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 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 服务器的 docker 容器。如果由于某种原因失败,我会在容器日志中看到输出详细说明原因。当我通过 github 部署将其上传到 heroku 时,我在日志中只看到
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插件Postgres数据库上运行,完全正常 尽可能简化构建过程 删除默认端口(以确保它选择$PORT),并使用设置export PORT=8080在本地运行(完全正常,在Heroku中像我们预期的那样docker容器接收环境端口)
但我无法弄清楚为什么它在Heroku上立即退出。编辑:最初认为与端口值有关,但是我发现如何通过命令行给微服务指定一个端口,但它在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
我检查了Heroku的日志,除了一个“进程启动”和“进程崩溃”几乎立即出现外,其他都是空的。 - Kilbo
1个回答

1

好的,这不是一个很好的答案。Heroku文档中没有任何内容指导我为什么删除Dockerfile中的ENTRYPOINT exec java -XX:+UseContainerSupport -XX:MaxRAMPercentage=80.0 -noverify -XX:+AlwaysPreTouch -jar myjar.jar会起作用。当entrypoint被移除后,我可以再次看到日志,并且可以看到我的micronaut服务器正在启动。但是如果在Dockerfile中定义了ENTRYPOINT,我只会得到我上面发布的内容“Process starting”,然后立即崩溃。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接