如何推送由Docker管理的Docker容器组成Heroku?

Asp*_*Mat 20 heroku docker dockerfile docker-compose

我目前有一个本地测试和工作的Web应用程序,由4个docker容器组成:Java MVC,NodeJS,Flask和MongoDB.我有4个Dockerfiles,每个都有一个,我使用docker-compose.yml管理构建.

但是,现在我想将我的代码推送到Heroku,并且我在https://devcenter.heroku.com/articles/container-registry-and-runtime上阅读了文档.但是,如何在生产线上使用docker-compose似乎非常暧昧.这就是它在文档中所说的内容:

"如果您已经创建了一个多容器应用程序,则可以使用Docker Compose来定义本地开发环境.了解如何使用Docker Compose进行本地开发."

任何人都可以指导我使用Heroku的CLI将我的项目推送到Heroku容器的实际代码吗?

Asp*_*Mat 12

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

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

快乐的 Heroku ing。

  • 他们不能只支持 docker-compose 文件吗?我不想重写我的文件只是为了在heroku上运行它们,除了heroku之外别无他处。 (19认同)
  • 请注意,如果您在 Docker 中进行大量编译,需要超过 2GB 的默认内存(即 Angular 8+),那么它会在 Heroku 上神秘地失败。没有关于此行为的文档,在与 Heroku 支持人员合作后,他们也不会允许对此进行调整。 (3认同)
  • @JMillner [这里有一些关于 heroku.yml 的文档](https://devcenter.heroku.com/articles/build-docker-images-heroku-yml),显然是在你的问题 3 天后发布的。 (3认同)
  • @Jens 我听到你的声音了。当我读到这条新闻时,我也想知道同样的事情。可能有一个我没有看到的原因,但只支持 docker-compose 是有意义的,这是迄今为止流行的选项之一。 (2认同)
  • 如果我使用heroku,我不介意编写一个heroku配置文件,但重写整个docker-compose似乎太多了。 (2认同)

eli*_*otn 6

您正在寻找的更准确的heroku文档是:https: //devcenter.heroku.com/articles/container-registry-and-runtime

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

FROM "<insert Dockerfile tag here>"
Run Code Online (Sandbox Code Playgroud)

要轻松设置它,您将使用不同的后缀命名Dockerfiles,例如Dockerfile.mongo,Dockerfile.node,Dockerfile.flask和Dockerfile.javamvc.后缀告诉heroku用于您的Web应用程序的dyno名称.当您需要推送所有容器时,您可以使用以下命令执行此操作,只要所有dockerfiles都具有唯一的后缀,它将递归构建所有dockerfiles:

heroku container:push --recursive
Run Code Online (Sandbox Code Playgroud)

由于Heroku不读取docker-compose文件,因此需要将任何环境变量setup/port exposure/etc迁移到Dockerfile.另外,由于我无法在Heroku上找到如何使用容器进行持久存储/卷安装,我建议您为mongo数据库使用Heroku插件.

在Heroku上,您将看到您的应用程序作为每个Dockerfile的一个dyno运行,每个dyno的名称作为每个Dockerfile的后缀.

更新:

  1. 特拉维斯提出了一个很好的观点.确保在Dockerfile中有一个CMD语句,否则heroku将抛出错误.
  2. Yesterdayeroku最近还为该过程添加了一个步骤,您需要为heroku container:release <your dyno name>要更新的每个dyno 运行.

  • 只是为了澄清……我认为强调这一点很重要:Heroku 不像与 Dockerfiles 那样与 docker-compose 集成。除了前面提到的环境变量,我认为通过 Dockerfile 中的“CMD”语句启动应用程序很重要,而不是仅仅假设 docker-compose.yml 文件将通过命令节来完成...? (5认同)