Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何执行从一个docker容器到另一个docker容器的命令_Docker_Docker Container_Docker Networking_Docker Command - Fatal编程技术网

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

如何执行从一个docker容器到另一个docker容器的命令,docker,docker-container,docker-networking,docker-command,Docker,Docker Container,Docker Networking,Docker Command,我正在创建一个应用程序,允许用户上传视频文件,然后进行一些处理 我有两个容器 Nginx为用户上传视频文件的网站提供服务的容器 安装了FFmpeg和一些其他处理工具的视频处理容器 我想要达到的目标。我需要容器1能够在容器2上运行bash脚本 据我所知,一种可能性是让他们通过API通过HTTP进行通信。但接下来我需要在容器2中安装一个web服务器,并编写一个API,这似乎有点过头了。 我只想执行一个bash脚本 有什么建议吗 我相信 docker exec -it <container_na

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

我有两个容器

  • Nginx
    为用户上传视频文件的网站提供服务的容器
  • 安装了
    FFmpeg
    和一些其他处理工具的视频处理容器
  • 我想要达到的目标。我需要容器1能够在容器2上运行bash脚本

    据我所知,一种可能性是让他们通过API通过HTTP进行通信。但接下来我需要在容器2中安装一个web服务器,并编写一个API,这似乎有点过头了。 我只想执行一个bash脚本

    有什么建议吗

    我相信

    docker exec -it <container_name> <command>
    

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

  • 您需要在容器上安装docker(并在docker中执行docker操作)
  • 您需要共享unix套接字,如果您不知道自己在做什么,这不是一件好事
  • 因此,这给我们留下了两个解决方案:

  • 在您的容器上安装ssh,并通过ssh执行命令
  • 共享一个卷,并有一个监视触发批处理的进程

  • 你有几个选择,但时间思维中的前两个选择是:

  • 在容器1中,安装Docker CLI并绑定安装
    /var/run/docker.sock
    (您需要从 主机(当您启动容器时)。然后,在容器内,您 应该能够对绑定使用
    docker
    命令 套接字,就像从主机执行它们一样(您也可以 需要
    chmod
    容器内的套接字才能允许非根 用户可以这样做
  • 您可以在容器2上安装
    SSHD
    ,然后从容器1中安装
    ssh
    ,并运行您的脚本。这里的优点是,您不需要在容器内部进行任何更改,以说明它们是在Docker而不是裸机中运行的。缺点是,您需要将SSHD设置添加到您的应用程序中Dockerfile或启动脚本
  • 我能想到的大多数其他想法只是选项(2)的变体,SSHD被其他工具所取代


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

    前面已经提到过,但一个合理的半黑客选项是在两个容器中安装SSH,然后使用SSH在另一个容器上执行命令:

    # install SSH, if you don't have it already
    sudo apt install openssh-server
    
    # start the ssh service
    sudo service start ssh
    
    # start the daemon
    sudo /usr/sbin/sshd -D &
    
    假设您不希望总是root用户,您可以添加默认用户(在本例中为“foobob”):

    在源容器和目标容器上执行此操作。现在可以执行从容器_1到容器_2的命令

    # obtain container-id of target container using 'docker ps'
    ssh foobob@<container-id> << "EOL"
    echo 'hello bob from container 1' > message.txt
    EOL
    

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

    是一个Flask扩展,用于将命令行工具转换为RESTful API,只需5行代码

    示例代码

    从烧瓶导入烧瓶
    从执行器导入执行器
    从flask_shell2http导入shell2http
    app=烧瓶(名称)
    执行者=执行者(应用程序)
    shell2http=shell2http(app=app,executor=executor,base_url_prefix=“/commands/”)
    shell2http.register_命令(endpoint=“saythis”,command_name=“echo”)
    shell2http.register_命令(endpoint=“run”,command_name=“./myscript”)
    
    可以很容易地称之为

    $ curl -X POST -H 'Content-Type: application/json' -d '{"args": ["Hello", "World!"]}' http://localhost:4000/commands/saythis
    
    您可以使用它来创建RESTful微服务,这些服务可以异步执行带有动态参数的预定义shell命令/脚本并获取结果


    它支持文件上传、回调fn、反应式编程等。我建议您签出。

    您可以只使用共享卷并观察更改。.您还可以共享
    /var/run/docker.sock
    并从容器中运行docker命令。这不是一个真正好的设计。您需要解决这个问题的技术如果两个容器在物理上独立的系统上运行,则它们是相同的。从容器内部调用
    docker
    本身无法工作。您需要两件事,1:
    /var/run/docker.sock
    共享,2:docker的一个版本在您的容器上运行,如果容器和主机都是linux,则一些用户共享重新托管docker binary。但更好的选择是安装带有docker的容器映像,以便主机可以是windows或linux。很公平,没有考虑在运行的容器中安装docker的要求。没问题,。还值得注意的是,您只需要在容器中安装docker cli。遗漏了这一点:)请记住,这还允许容器以root用户身份对主机上的任意文件进行任意更改,并通常接管整个系统。我不会随便这么做。我正在考虑共用docker插座。但我不喜欢在我的docker映像中安装docker的想法。这似乎有点危险,特别是因为我没有完全掌握它可能会打开哪些安全漏洞。监视文件夹中的文件也不会起作用,因为我需要根据一些参数运行不同的脚本。对于每个场景,我必须有许多不同的文件夹。因此,这让我们可以通过SSH执行命令。这可能是最好的解决方案。我试试看,谢谢+1对于共享卷的想法。对touchfile进行轮询通常不是我最喜欢的方法,但它确实起到了作用,而且可能是最简单的解决方案,具体取决于具体情况。我考虑过使用docker套接字的选项1,但似乎有点危险。我也不喜欢在docker内部安装docker的想法。我会选择SSHD,因为它似乎是最好的选择。谢谢你的帮助,非常感谢很多人都会同意你的观点
    # obtain container-id of target container using 'docker ps'
    ssh foobob@<container-id> << "EOL"
    echo 'hello bob from container 1' > message.txt
    EOL
    
    sshpass -p 'foobob' ssh foobob@<container-id>
    
    $ curl -X POST -H 'Content-Type: application/json' -d '{"args": ["Hello", "World!"]}' http://localhost:4000/commands/saythis