【问题标题】:Listening port for deployment, nodejs docker部署监听端口,nodejs docker
【发布时间】:2020-02-25 15:21:14
【问题描述】:

我有一个简单的 node.js - express 应用程序,并将监听端口设置为 3000。 在我的 Dockerfile 上,我公开端口 3000 并使用 -p 3000:3000 运行容器。

我想使用我的 docker 镜像在 Heroku 上部署我的应用,正确的做法是什么?

我知道在这些情况下,我们使用process.env 或在.env 文件中指定一个全局变量。

我在我的 Dockerfile 下面列出。

FROM node:10-alpine as builder

ARG NODE_ENV=production
ENV NODE_ENV=${NODE_ENV}

RUN apk --no-cache add python make g++

COPY package*.json ./

RUN npm install --only=production
# RUN npm ci --only=production

FROM node:10-alpine

WORKDIR /usr/src/app

COPY --from=builder node_modules node_modules

COPY . .

EXPOSE 3000

CMD [ "npm", "run", "start:prod" ]

解决问题的正确方法是什么? 此外,我们非常欢迎任何有关改进我的 Dockerfile 的建议。

【问题讨论】:

    标签: node.js docker express heroku deployment


    【解决方案1】:

    在 Heroku 上部署 Web 应用程序时,它们会通过 env 变量告诉您​​哪个端口是空闲的。您必须在源代码中绑定该端口。
    在您的 Dockerfile 中删除 EXPOSE 3000,因为您无法打开自定义端口。

    在您的源代码中,您必须编写类似const port = process.env.PORT || 3000 的内容。
    因此,当您在本地执行程序并且没有设置 env var $PORT 时,它将打开端口 3000。在 Heroku 上,它将打开 $PORT 中指定的端口。


    在 Heroku 上部署时的一个常见障碍是您的 URL 不再有效。在本地运行时,您可能有 URL:http://localhost:3000/,但在 Heroku 上您有:https://my-app.herokuapp.com/
    https 可能会引起一些头痛,因为您可能一直在使用 http。此外,如果您在主机名末尾对端口进行硬编码,则会导致一些问题。 Heroku 自动将主机名转换为 IP 地址 + 端口。


    您可以在此处阅读有关在 Docker 上部署的信息:
    https://devcenter.heroku.com/categories/deploying-with-docker
    https://devcenter.heroku.com/articles/build-docker-images-heroku-yml

    确定您的代码与 Heroku 兼容后,您就可以开始进行 Heroku Docker 部署了。这篇文章非常透彻,我相信如果你阅读它们比我只是复制粘贴那里所说的内容更好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-23
      • 2020-08-31
      • 1970-01-01
      • 1970-01-01
      • 2016-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多