如何在本地运行一次性 Docker 容器(从容器内触发)

Posted

技术标签:

【中文标题】如何在本地运行一次性 Docker 容器(从容器内触发)【英文标题】:How to run one-off Docker containers locally (triggered from within a container) 【发布时间】:2018-11-02 02:16:19 【问题描述】:

在 Heroku 上托管应用程序时,我经常通过代码中的 Heroku API 触发一次性 dynos,以便在后台执行繁重的工作。我最近在 AWS 上设置了一些堆栈,并通过使用 AWS ECS 运行任务遵循了类似的模式。

我没有为此使用长时间运行的队列工作程序,因为硬件资源根据具体任务的不同而有很大差异,而且通常工作负载会出现在高峰期。

对于本地开发,我通常通过在正在运行的容器中执行后台任务或从控制台手动触发后台命令来跳过这个主题。什么是在本地运行一次性容器的好方法?

【问题讨论】:

从你的代码中触发'heroku local:run'怎么样? 我正在运行 php。我怎么能从容器中运行它而不是触发进程的容器的子进程?除此之外,我还在寻找这个问题的通用解决方案。 也许您可以在本地开发环境中运行第二个容器,其中您将有一个“spawner”进程负责根据从您的 PHP 收到的输入启动“heroku local:run”进程在您的主容器中?因此,在 Heroku 上,您使用平台 API 来启动一次性 dyno,而在 dev 上,您会触发辅助容器来启动“heroku local:run”进程。 听起来你需要让你的第一个容器访问 AWS api 并在 ECS 上创建第二个容器 【参考方案1】:

ECS 支持计划任务,如果您知道计划高峰的时间,您可以使用计划任务按计划启动 Fargate 容器。

如果您不这样做,我们所做的是编写一个小型 API Gateway -> Lambda 函数,该函数基本上动态启动 Fargate 容器,其中包含在 POST 中定义的一些变量到 API Gateway 端点,如 CPU/Mem/port 等。 . 或者预先创建任务定义并将任务定义传递给 api,如果您知道容器的大部分“设置”应该是什么,这是另一种选择。

【讨论】:

【参考方案2】:

您可以简单地从容器内部调用 ECS RunTask API 调用。

您只需将 ECS 任务角色设置为具有 runtask 权限并在容器中拥有 aws cli 或任何 aws sdk 即可调用 runtask 调用。

【讨论】:

【参考方案3】:

您可以将 docker 套接字作为卷传递

volumes:
     - /var/run/docker.sock:/var/run/docker.sock

之后你可以在容器内运行docker命令,它们将由宿主机上的docker执行。

特别是你可以运行

docker run ...

docker start ...

(可能您必须通过Dockerfile 中的命令在容器中安装 docker)

【讨论】:

以上是关于如何在本地运行一次性 Docker 容器(从容器内触发)的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Docker 容器连接到本地 Redis 服务器?

如何通过Google Cloud调试在Docker容器内运行的Nodejs应用程序

从 Docker 容器将 PySpark 连接到 Kafka

docker一次查看两个容器日志

将本地 Elixir/Erlang 连接到 Docker 容器内正在运行的应用程序

在 Docker 容器内运行 Spring Boot 应用程序,无法连接 MySQL