如何从一个 docker 容器执行命令到另一个

Nic*_*uch 11 docker docker-networking docker-container docker-command

我正在创建一个应用程序,它允许用户上传视频文件,然后进行一些处理。

我有两个容器。

  1. Nginx 为用户可以上传视频文件的网站提供服务的容器。
  2. FFmpeg安装了一些其他处理工具的视频处理容器。

我想要达到的目标。我需要容器 1 才能在容器 2 上运行 bash 脚本。

据我所知,一种可能性是让它们通过 API 通过 HTTP 进行通信。但随后我需要在容器 2 中安装一个 Web 服务器并编写一个 API,这似乎有点矫枉过正。我只想执行一个 bash 脚本。

有什么建议?

Mar*_*CRA 7

docker从容器运行命令并不简单,也不是一个好主意(在我看来),因为:

  1. 您需要在容器上安装 docker(并在 docker 东西中执行 docker)
  2. 您需要共享 unix 套接字,如果您不知道自己在做什么,这不是一件好事。

所以,这给我们留下了两个解决方案:

  1. 在你的容器上安装 ssh 并通过 ssh 执行命令
  2. 共享一个卷并有一个过程来观察触发你的批处理的东西


Z4-*_*ier 7

您有几个选择,但首先想到的两个是:

  1. 在容器 1 中,安装 Docker CLI 并绑定挂载 /var/run/docker.sock(启动容器时需要从主机指定绑定挂载)。然后,在容器内,您应该能够docker对绑定安装的套接字使用命令,就像您是从主机执行它们一样(您可能还需要chmod使用容器内的套接字以允许非 root 用户执行此操作。
  2. 您可以SSHD在容器 2 上安装,然后ssh从容器 1 安装并运行您的脚本。这里的优点是您不需要在容器内进行任何更改来解释它们在 Docker 中运行而不是在裸机中运行的事实。不利的一面是您需要将 SSHD 设置添加到 Dockerfile 或启动脚本中。

我能想到的大多数其他想法只是选项 (2) 的变体,SSHD 被其他一些工具取代。

还要注意 Docker 网络有点奇怪(至少在 Mac 主机上),因此您需要确保容器使用相同的 docker-network 并且能够通过它进行通信。

  • 我考虑过使用 docker 套接字的选项 1,但似乎有点危险。我也不喜欢在 docker 内部安装 docker 的想法。我会选择 SSHD 选项,因为它似乎是最佳选择。感谢您的帮助,非常感谢 (3认同)

Esh*_*an7 6

我专门为这个用例编写了一个 python 包。

Flask-Shell2HTTP是一个 Flask 扩展,只需 5 行代码即可将命令行工具转换为 RESTful API。

示例代码

from flask import Flask
from flask_executor import Executor
from flask_shell2http import Shell2HTTP

app = Flask(__name__)
executor = Executor(app)
shell2http = Shell2HTTP(app=app, executor=executor, base_url_prefix="/commands/")

shell2http.register_command(endpoint="saythis", command_name="echo")
shell2http.register_command(endpoint="run", command_name="./myscript")
Run Code Online (Sandbox Code Playgroud)

可以很容易地调用,例如,

$ curl -X POST -H 'Content-Type: application/json' -d '{"args": ["Hello", "World!"]}' http://localhost:4000/commands/saythis
Run Code Online (Sandbox Code Playgroud)

您可以使用它来创建 RESTful 微服务,该服务可以异步执行带有动态参数的预定义 shell 命令/脚本并获取结果。

它支持文件上传、回调 fn、响应式编程等。我建议您查看示例