Nic*_*uch 11 docker docker-networking docker-container docker-command
我正在创建一个应用程序,它允许用户上传视频文件,然后进行一些处理。
我有两个容器。
Nginx 为用户可以上传视频文件的网站提供服务的容器。 FFmpeg安装了一些其他处理工具的视频处理容器。我想要达到的目标。我需要容器 1 才能在容器 2 上运行 bash 脚本。
据我所知,一种可能性是让它们通过 API 通过 HTTP 进行通信。但随后我需要在容器 2 中安装一个 Web 服务器并编写一个 API,这似乎有点矫枉过正。我只想执行一个 bash 脚本。
有什么建议?
docker从容器运行命令并不简单,也不是一个好主意(在我看来),因为:
所以,这给我们留下了两个解决方案:
您有几个选择,但首先想到的两个是:
/var/run/docker.sock(启动容器时需要从主机指定绑定挂载)。然后,在容器内,您应该能够docker对绑定安装的套接字使用命令,就像您是从主机执行它们一样(您可能还需要chmod使用容器内的套接字以允许非 root 用户执行此操作。SSHD在容器 2 上安装,然后ssh从容器 1 安装并运行您的脚本。这里的优点是您不需要在容器内进行任何更改来解释它们在 Docker 中运行而不是在裸机中运行的事实。不利的一面是您需要将 SSHD 设置添加到 Dockerfile 或启动脚本中。我能想到的大多数其他想法只是选项 (2) 的变体,SSHD 被其他一些工具取代。
还要注意 Docker 网络有点奇怪(至少在 Mac 主机上),因此您需要确保容器使用相同的 docker-network 并且能够通过它进行通信。
我专门为这个用例编写了一个 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、响应式编程等。我建议您查看示例。
| 归档时间: |
|
| 查看次数: |
9011 次 |
| 最近记录: |