如何在 Heroku 中运行 Docker 容器

Posted

技术标签:

【中文标题】如何在 Heroku 中运行 Docker 容器【英文标题】:How to run a Docker Container in Heroku 【发布时间】:2020-11-28 10:00:17 【问题描述】:

我正在编写一个 Python Django Web 应用程序,该应用程序当前部署在 Heroku 上。对于某些类型的请求,我想在隔离环境中运行 docker 容器。例如,我的一个 API 端点如下所示:

import docker
def post(request):
    # do some work here...
    client = docker.from_env()
    client.containers.run('some-image', 'some command')
    # format and return response here...

如何设置我的 Heroku 应用程序,以便我可以在我的 Web 应用程序中创建和运行这样的 docker 容器?我已经在本地测试了所有内容并验证了它是否有效。我只需要将它部署到 Heroku。

【问题讨论】:

我怀疑你能做到。为什么要以这种方式运行命令?容器是否包含您的主应用程序没有的功能,或者您是否出于安全原因尝试对它们进行沙箱处理? 出于安全原因,我想对它们进行沙箱处理。容器运行通过 post 请求传入的代码 - 类似于在线 IDE 或代码编辑器上发生的情况。 在这种情况下,我建议您考虑在one-off dynos 中运行它们。这对于某些用例来说是微不足道的(并且是自动的),例如与heroku run 交互,但我不确定如何从编队测功机启动一次性测功机。不过应该是可以的。 谢谢!看起来 Heroku 平台 API 允许您以编程方式 create one-off dynos。我会试试这个,让你知道 【参考方案1】:

更新:

我对此进行了更多研究,似乎Heroku Platform API 确实允许您按需创建一次性测功机,但它们不能提供完全隔离,因为每个一次性测功机都将注入与主 Web 进程相同的配置变量,使其理论上可以访问数据库和可能暴露给您的应用程序的任何其他配置变量。 Heroku 支持团队已确认此行为。

此外,在 Heroku 上大规模运行这样的应用程序最终会非常昂贵。

要构建具有此功能的应用程序,目前最好的选择似乎是使用不同的托管服务提供商。

【讨论】:

以上是关于如何在 Heroku 中运行 Docker 容器的主要内容,如果未能解决你的问题,请参考以下文章

Heroku 上带有容器注册表的发布阶段运行容器

如何为在 docker 容器内运行的 corda 节点运行迁移脚本?

在Docker容器中运行Spring Boot GraalVM原生镜像

Next.js 从 Docker 容器无限重新加载

在heroku中无法发布推送的docker镜像。

如何用Docker安装Eclipse Che和Codenvy