【问题标题】:Heroku run Docker image with port parameterHeroku 使用端口参数运行 Docker 映像
【发布时间】:2017-10-14 00:41:37
【问题描述】:

当我将现有的 Docker 映像推送到 Heroku 时,Heroku 提供了一个 $PORT 环境变量。如何将此属性传递给 Heroku 运行实例?

localhost 这会起作用:

docker pull swaggerapi/swagger-ui
docker run -p 80:8080 swaggerapi/swagger-ui

我应该在 Heroku 上做:

docker run -p $PORT:8080 swaggerapi/swagger-ui

这样的事情可能吗?

【问题讨论】:

  • 我认为 Heroku 期望您的网络应用程序将侦听 $PORT 而不是您选择它将侦听的端口。见devcenter.heroku.com/articles/container-registry-and-runtime
  • 是的,这是正确的。我的主要问题是如何在我的 dockerfile 中定义这个 $PORT 变量?
  • 你发现了吗?我目前正在尝试运行同样的事情。看起来你不需要做任何事情,但它对我不起作用。
  • 我在发布此内容时没有找到解决方案。对不起。
  • 有没有人帮我解决这些问题,但不知道如何在 Heroku 上部署本地运行的 swagger 图像以及如何访问它?

标签: heroku docker dockerfile


【解决方案1】:

这个问题现在已经很老了,但如果它可以对其他人有所帮助,我仍然会在这里写下我的答案。

我有 spring-boot 应用程序以及 swagger-ui Dockerized 并部署在 Heroku 上。

这是我的 application.yml 看起来像:

server:
  port: ${PORT:8080}
  forward-headers-strategy: framework
  servlet:
   contextPath: /my-app

springdoc:
  swagger-ui:
    path: '/swagger-ui.html'

以下是我的 DockerFile 配置。

FROM maven:3.5-jdk-8 as maven_build
WORKDIR /app

COPY pom.xml .
RUN mvn clean package -Dmaven.main.skip -Dmaven.test.skip && rm -r target

COPY src ./src
RUN mvn package spring-boot:repackage

########run stage########
FROM openjdk:8-jdk-alpine
WORKDIR /app
RUN apk add --no-cache bash


COPY --from=maven_build /app/target/springapp-1.1.1.jar ./

#run the app
# 256m was necessary for me, as I am using free version so Heroku was giving me memory quota limit exception therefore, I restricted the limit to 256m
ENV JAVA_OPTS "-Xmx256m"
ENTRYPOINT  ["java","${JAVA_OPTS}", "-jar","-Dserver.port=${PORT}", "springapp-1.1.1.jar"]

我用来创建 heroku 应用的命令:

heroku create
heroku stack:set container

我用来构建镜像和部署的命令:

docker build -t app-image .
heroku container:push web
heroku container:release web

最后确保 Heroku Dashboard 上的测功机信息如下所示:

web java \$\{JAVA_OPTS\} -jar -Dserver.port\=\$\{PORT\} springapp-1.1.1.jar

完成所有这些步骤后,我可以通过

访问 swagger-ui

https://testapp.herokuapp.com/my-app/swagger-ui.html

【讨论】:

    【解决方案2】:

    您的 Docker 容器需要在 Heroku 指定的端口中侦听 HTTP 流量。

    查看Github repo for swaggerapi/swagger-ui中的Dockerfile,看起来它已经支持了PORT环境变量:https://github.com/swagger-api/swagger-ui/blob/be72c292cae62bcaf743adc6236707962bc60bad/Dockerfile#L13

    所以也许你真的不需要做任何事情? 如果将此图像作为 Web 应用程序发送到 Heroku,它看起来就可以正常工作。

    【讨论】:

      猜你喜欢
      • 2020-11-13
      • 2021-08-22
      • 2020-09-06
      • 2021-01-01
      • 2017-07-30
      • 1970-01-01
      • 1970-01-01
      • 2021-08-19
      • 2017-04-20
      相关资源
      最近更新 更多