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