Heroku docker spring boot 镜像错误 503 H14

Posted

技术标签:

【中文标题】Heroku docker spring boot 镜像错误 503 H14【英文标题】:Heroku docker spring boot image error 503 H14 【发布时间】:2020-06-19 14:19:51 【问题描述】:

几天前,我试图将 Spring Boot 应用程序的 Docker 映像部署到 Heroku。

我有以下 docker 文件:

FROM openjdk:8-jdk-alpine
LABEL maintainer="gabigarciagar@gmail.com"
VOLUME /tmp
COPY ./target/*.jar PetApp_Auth.jar
CMD [ "java","-Xmx300m","-Xss512k","-XX:CICompilerCount=2","-Dfile.encoding=UTF-8","-Dspring.profiles.active=heroku","-Djava.security.egd=file:/dev/./urandom","-jar","/PetApp_Auth.jar" ]

在我的 application.properties 中,我有一个 heroku 个人资料:

spring.profiles.active=heroku
server.port=$PORT
server.servlet.context-path=/

然后我执行以下命令,everithig 看起来不错:

$ heroku container:push petapp-authserver -a petapp-authserver
Your image has been successfully pushed. You can now release it with the 'container:release' command.

$ heroku container:release petapp-authserver -a petapp-authserver
Releasing images petapp-authserver to petapp-authserver... done

heroku 日志还显示应用程序已启动,heroku ps 数据库连接也很完美

$ heroku ps -a petapp-authserver
=== petapp-authserver (Free): java -Xmx300m -Xss512k -XX:CICompilerCount\=2 -Dfile.encoding\=UTF-8 -Dspring.profiles.active\=heroku -Djava.security.egd\=file:/dev/./urandom -jar /PetApp_Auth.jar (1)
petapp-authserver.1: up 2020/03/06 21:09:51 +0100 (~ 1m ago)

然后,当我尝试查看 swagger-ui o /actuator/health 时,我得到以下信息:

2020-03-06T20:11:58.149484+00:00 heroku[router]: at=error code=H14 desc="No web processes running" method=GET path="/" host=petapp-authserver.herokuapp.com request_id=e88c2499-b1de-4284-a649-1d8df19ae6c0 fwd="79.147.107.220" dyno= connect= service= status=503 bytes= protocol=https
2020-03-06T20:11:59.443315+00:00 heroku[router]: at=error code=H14 desc="No web processes running" method=GET path="/favicon.ico" host=petapp-authserver.herokuapp.com request_id=9fa4951a-365c-4b9b-bf63-94f8d6792249 fwd="79.147.107.220" dyno= connect= service= status=503 bytes= protocol=https
2020-03-06T20:12:08.185495+00:00 heroku[router]: at=error code=H14 desc="No web processes running" method=GET path="/actuator/health" host=petapp-authserver.herokuapp.com request_id=c4c3382b-43b7-494c-9259-630ce24eb8a4 fwd="79.147.107.220" dyno= connect= service= status=503 bytes= protocol=https
2020-03-06T20:12:08.697245+00:00 heroku[router]: at=error code=H14 desc="No web processes running" method=GET path="/favicon.ico" host=petapp-authserver.herokuapp.com request_id=b044b6fe-ba8d-4b3d-8c7c-8e477ea7b609 fwd="79.147.107.220" dyno= connect= service= status=503 bytes= protocol=https
2020-03-06T20:12:12.943276+00:00 heroku[router]: at=error code=H14 desc="No web processes running" method=GET path="/actuator/health" host=petapp-authserver.herokuapp.com request_id=6ac05b16-148d-4849-a857-c3d6bed9fe01 fwd="79.147.107.220" dyno= connect= service= status=503 bytes= protocol=http
2020-03-06T20:12:13.637589+00:00 heroku[router]: at=error code=H14 desc="No web processes running" method=GET path="/favicon.ico" host=petapp-authserver.herokuapp.com request_id=2c01dbaa-18c5-46f8-8f43-f91ee372a5eb fwd="79.147.107.220" dyno= connect= service= status=503 bytes= protocol=http
2020-03-06T20:12:23.492570+00:00 heroku[router]: at=error code=H14 desc="No web processes running" method=GET path="/swagger-ui.html" host=petapp-authserver.herokuapp.com request_id=2850eb70-1bd5-4737-9505-d59184e95946 fwd="79.147.107.220" dyno= connect= service= status=503 bytes= protocol=http
2020-03-06T20:12:23.878827+00:00 heroku[router]: at=error code=H14 desc="No web processes running" method=GET path="/favicon.ico" host=petapp-authserver.herokuapp.com request_id=f83acdef-840a-4e2e-824c-183cfdc50273 fwd="79.147.107.220" dyno= connect= service= status=503 bytes= protocol=http

正如heroku web所说https://devcenter.heroku.com/articles/error-codes#h14-no-web-dynos-running

我执行:

heroku ps:scale petapp-authserver=1 -a petapp-authserver
Scaling dynos... done, now running petapp-authserver at 1:Free

同样的错误

我做错了什么??

我能够直接部署 jar 并且它可以工作

heroku deploy:jar PetApp_AuthServer-V-0.0.0.jar -a petapp-authserver
Uploading PetApp_AuthServer-V-0.0.0.jar
-----> Packaging application...
       - app: petapp-authserver
       - including: PetApp_AuthServer-V-0.0.0.jar
-----> Creating build...
       - file: slug.tgz
       - size: 46MB
-----> Uploading build...
       - success
-----> Deploying...
remote:
remote: -----> heroku-deploy app detected
remote: -----> Installing JDK 1.8... done
remote: -----> Discovering process types
remote:        Procfile declares types -> web
remote:
remote: -----> Compressing...
remote:        Done: 96.8M
remote: -----> Launching...
remote:        Released v12
remote:        https://petapp-authserver.herokuapp.com/ deployed to Heroku
remote:
-----> Done

2020-03-13T19:25:13.683982+00:00 heroku[router]: at=info method=POST path="/auth/login" host=petapp-authserver.herokuapp.com request_id=ef9a29b6-c10c-4b82-8088-711d448c3a32 fwd="88.17.74.86" dyno=web.1 connect=1ms service=362ms status=200 bytes=878 protocol=https
2020-03-13T19:25:13.780163+00:00 heroku[router]: at=info method=GET path="/webjars/springfox-swagger-ui/fonts/titillium-web-v6-latin-600.woff2" host=petapp-authserver.herokuapp.com request_id=f2f6334d-2663-49b0-bd28-b5d287e79b68 fwd="88.17.74.86" dyno=web.1 connect=1ms service=13ms status=200 bytes=12634 protocol=https

为什么它完全适用于 jar deploy 而不是 docker??

我也试过了:

Gabi@MSI MINGW64 /d/Proyectos/PetApp/Back/PetApp_AuthServer (develop)
$ heroku container:release web petapp-authserver -a petapp-authserver
 !    Expected response to be successful, got 404

Gabi@MSI MINGW64 /d/Proyectos/PetApp/Back/PetApp_AuthServer (develop)
$ heroku container:release web petapp-authserver -a petapp-authserver
 !    Expected response to be successful, got 404

Gabi@MSI MINGW64 /d/Proyectos/PetApp/Back/PetApp_AuthServer (develop)
$ heroku container:release petapp-authserver -a petapp-authserver
Releasing images petapp-authserver to petapp-authserver... done

提前致谢

【问题讨论】:

顺便说一句,这不是因为 spring security 我已经配置它以允许这样的端点 请在您的问题中包含heroku.yml。如果您按照我的回答,它将摆脱 H14 No web dyno running 错误:devcenter.heroku.com/articles/… heroku ps -a petapp-authserver === petapp-authserver(免费):java -Xmx300m -Xss512k -XX:CICompilerCount\=2 -Dfile.encoding\=UTF-8 -Dspring.profiles .active\=heroku -Djava.security.egd\=file:/dev/./urandom -jar /app.jar (1) petapp-authserver.1: up 2020/03/13 19:55:28 +0100 ( ~ 6m 前) heroku ps:scale petapp-authserver=1 -a petapp-authserver Scaling dynos... 完成,现在在 1:Free 运行 petapp-authserver 相同的错误 您的错误只是与招摇和执行器有关吗?其他休息控制器会发生什么? 【参考方案1】:

我终于解决了这个问题。 关键是heroku中的图像必须与进程类型命名相同,在本例中为web!

所以有两种选择。使用以下命令构建和推送镜像:

heroku container:push web -a petapp-authserver

或在本地创建镜像并将其标记为 registry.heroku.com/petapp-authserver/web

docker tag petapp-authserver registry.heroku.com/petapp-authserver/web

docker push registry.heroku.com/petapp-authserver/web
The push refers to repository [registry.heroku.com/petapp-authserver/web]
eb03575d1edf: Preparing
ceaf9e1ebef5: Preparing
9b9b7f3d56a0: Preparing
f1b5933fe4b5: Preparing
eb03575d1edf: Layer already exists
9b9b7f3d56a0: Layer already exists
f1b5933fe4b5: Layer already exists
ceaf9e1ebef5: Layer already exists
latest: digest: sha256:4c0ae2bba092c07bbd89394216b0bf78f458ba3583e63c8d15e01f6b07d6933e size: 1159

heroku container:release web -a petapp-authserver
Releasing images web to petapp-authserver... done

现在我的容器在 docker 中完美运行了!!

谢谢大家

【讨论】:

【参考方案2】:

关键点是流程类型。

例如,当您部署 jar 并运行它时,您可以在日志中看到:

remote: -----> Discovering process types
remote:        Procfile declares types -> web

但是你在使用 release 时看不到它,因为你没有指定进程类型。 能不能试试这样运行release命令看看能不能用?

heroku container:release web petapp-authserver -a petapp-authserver

web 是进程类型!

【讨论】:

$ heroku container:release web petapp-authserver -a petapp-authserver !预期响应成功,得到 404 $ heroku container:release petapp-authserver -a petapp-authserver 将图像 petapp-authserver 发布到 petapp-authserver...完成 看来流程必须以其他方式声明【参考方案3】:

在您的Procfileheroku.yml 中,您没有指定web 工作人员。

2020-03-06T20:12:23.878827+00:00 heroku[router]: at=error code=H14 desc="No web processes running" method=GET path="/favicon.ico" host=petapp-authserver.herokuapp.com request_id=f83acdef-840a-4e2e-824c-183cfdc50273 fwd="79.147.107.220" dyno= connect= service= status=503 bytes= protocol=http

对于容器,您应该使用heroku.ymlProcfile 甚至可能被忽略。

https://devcenter.heroku.com/articles/build-docker-images-heroku-yml

这样做会消除您当前的 H14 错误。

【讨论】:

我应该在哪里存储 heroku.yml 文件?在容器内?还有为什么我不能只用 dockerFile 构建图像?如果我添加 heroku.yml 文件,我一直使用的命令和过程应该是一样的吗?关键是我的 git repo 在同一个 repo 中包含一个 los Back spring boot 微服务,对我来说,这比每个微服务有 12 个 repos 更容易,它会影响在 heroku 上部署吗?对不起我的英语 它需要在你的 git repo 的根文件夹中。 dockerfile 本身并没有指定进程类型。 Heroku 上有 2 个进程。一个 Web 进程,您可以在其中获得分配的 $PORT 以及其他任何基本上只是一个没有任何暴露端口的进程。您可以尝试运行命令heroku container:release web -a petapp-authserver 看看是否仍然出现H14 错误。 devcenter.heroku.com/articles/container-registry-and-runtime。 medium.com/@urbanswati/… heroku.yml 我骑过它用于使用 repo 的 heroku 构建容器,但我不想要那个!,我不想像我说的那样使用我的 git repo 我已经更新了帖子,因为使用 jar 部署它可以完美运行,无需任何 heroky.ymal 文件或类似文件

以上是关于Heroku docker spring boot 镜像错误 503 H14的主要内容,如果未能解决你的问题,请参考以下文章

Heroku H14(没有运行 Web 进程)+ Spring-boot

Heroku Spring Boot 不构建 Jar

Spring Boot + Angular 2 Heroku 部署

Heroku 无法部署 Java 11 Spring Boot App [重复]

从 Spring Boot 连接到 Heroku Postgres

使用 nginx 作为代理的 Spring Boot 应用程序部署在 Heroku 上