【问题标题】:How to push Docker containers managed by Docker-compose to Heroku?如何将 Docker-compose 管理的 Docker 容器推送到 Heroku?
【发布时间】:2018-04-04 20:51:54
【问题描述】:

我目前有一个经过本地测试且可以运行的 Web 应用程序,它由 4 个 docker 容器组成:Java MVC、NodeJS、Flask 和 MongoDB。我有 4 个 Dockerfile,每个一个,我使用 docker-compose.yml 管理构建。

但是,现在我想将我的代码推送到 Heroku,并阅读了https://devcenter.heroku.com/articles/container-registry-and-runtime 的文档。但是,关于如何在生产线上使用 docker-compose 似乎很模棱两可。这是它在文档上所说的:

“如果您创建了多容器应用程序,则可以使用 Docker Compose 定义您的本地开发环境。了解如何使用 Docker Compose 进行本地开发。”

谁能指导我了解如何使用 Heroku 的 CLI 将我的项目推送到 Heroku 容器的一些实际代码?

【问题讨论】:

  • 您是否创建了 docker-compose.yml 文件?如果您有 Dockerfile 来为您的应用程序和要公开的端口和要挂载的卷创建 docker 映像。我们可以创建一个 docker-compose.yml
  • 如果您的应用程序相互依赖,我们可以为所有应用程序创建 compose,否则您必须创建单独的 docker-compose.yml 文件
  • @JinnaBalu 我已经有一个 docker-compose.yml。但是,我正在寻找一种最终将我的代码推送到 Heroku 的方法,因为文档对它非常模棱两可。

标签: docker heroku docker-compose dockerfile


【解决方案1】:

更准确的 Heroku 文档可以帮助您了解您想要做的事情: https://devcenter.heroku.com/articles/container-registry-and-runtime

以上将引导您完成设置 heroku 容器插件并登录到注册表。您甚至可以在 dockerfile 中使用以下行将映像迁移到 Dockerfile:

FROM "<insert Dockerfile tag here>"

为了轻松设置,您将使用不同的后缀命名 Dockerfile,例如 Dockerfile.mongo、Dockerfile.node、Dockerfile.flask 和 Dockerfile.javamvc。后缀告诉 heroku 用于您的网络应用程序的测功机名称。当您需要推送所有容器时,可以使用以下命令执行此操作,该命令将递归构建所有 dockerfile,只要它们都有唯一的后缀:

heroku container:push --recursive

由于 Heroku 不读取 docker-compose 文件,任何环境变量设置/端口暴露/等都需要迁移到 Dockerfile。另外,由于我找不到如何在 Heroku 上使用容器进行持久存储/卷挂载,我建议您为 mongo 数据库使用 Heroku 插件。

在 Heroku 上,您会看到您的应用作为每个 Dockerfile 一个 dyno 运行,每个 dyno 的名称作为每个 Dockerfile 的后缀。

更新:

  1. Travis 提出了一个很好的观点。确保你的 Dockerfile 中有 CMD 语句,否则 heroku 会抛出错误。
  2. Heroku 最近在流程中添加了一个步骤,您需要为要更新的每个测功机运行 heroku container:release &lt;your dyno name&gt;

【讨论】:

  • 只是澄清一下...我认为有必要强调一下:Heroku 与 docker-compose 的集成方式与与 Dockerfile 的集成方式不同。除了前面提到的环境变量,我认为通过 Dockerfile 中的“CMD”语句启动应用程序很重要,而不是仅仅假设 docker-compose.yml 文件将通过命令节执行...?
【解决方案2】:

只是对这个问题的更新,因为它最近似乎受到了很多关注。

现在 Heroku 提供了官方支持的“Heroku.yml”解决方案。 您现在可以编写一个 .yml 文件(格式类似于 docker-compose),Heroku 将计算出您的图像。只需点击上面的链接了解详情。

Heroku-ing 快乐。

【讨论】:

  • 他们不能只支持 docker-compose 文件吗?我不想重写我的文件只是为了在 heroku 上运行它们,除了 heroku 之外别无他处。
  • @Jens 我听到了。当我阅读新闻时,我也在想同样的事情。我没有看到可能是有原因的,但只支持 docker-compose 是有意义的,这是迄今为止流行的选项之一。
  • 如果我使用heroku,我不介意写一个heroku配置文件,但是重写整个docker-compose似乎太多了。
  • 请注意,如果您在 Docker 中进行大量编译,需要超过 2gb 的默认内存,即 Angular 8+,那么它会在 heroku 上神秘地失败。没有关于这种行为的文档,在与 Heroku 支持合作后,他们也不允许对此进行调整。
  • @JMillner here's some documentation on heroku.yml,显然是在您提出问题 3 天后发布的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-24
  • 2019-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多