将命令从一个docker容器传递到另一个

时间:2016-08-31 08:59:47

标签: python node.js linux git docker

我有一个帮助容器和一个app容器。

帮助程序容器通过git处理代码通过app容器挂载到共享挂载。

我需要帮助程序容器检查克隆代码中的package.jsonrequirements.txt,如果存在运行npm installpip install -r requirements.txt,则存储依赖项共享安装。 Thing是npm命令和/或pip命令需要从app容器运行,以使helper容器尽可能通用且不可知。

一种解决方案是将docker套接字挂载到帮助程序容器并运行docker exec <command> <app container>,但如果我在一台主机上有数千个此类应用程序,该怎么办呢? 是否会有数百个容器同时访问docker socket的问题?还有更好的方法吗?获取在另一个容器上运行的命令?

2 个答案:

答案 0 :(得分:1)

没有&#34;容器到容器&#34;内部沟通层,如&#34; ssh&#34;。在这方面,容器与2个不同的VM一样独立(通常在网络部分旁边)。

您可以采用通常的方式,在&#34;接收&#34;上安装opensshd-server。服务器,仅将其配置为基于密钥。您无需将端口导出到主机,只需使用docker-internal网络连接到端口。在&#39;主叫服务器上部署ssh私钥&#39;并将公钥输入到接收服务器上的.ssh / authorized_keys中。在容器启动时间(卷装入)期间,您不要在图像中保留秘密(构建时间)。

也可能在.ssh / config中创建一个ssh-alias,并将HostVerify设置为no,因为容器可以重建。然后做

ssh <alias> your-command

答案 1 :(得分:0)

找到了我寻找的更好的方式:-)。

使用supervisord并运行xml rpc服务器使我能够运行类似:

supervisorctl -s http://127.0.0.1:9002 -utheuser -pthepassword start uwsgi supervisorctl -s http://127.0.0.1:9002 -utheuser -pthepassword start uwsgi

在帮助程序容器中,这将连接到在应用程序容器上的端口9002上运行的rpc服务器,并执行可能类似的程序块;

[program:uwsgi]
directory=/app
command=/usr/sbin/uwsgi --ini /app/app.ini --uid nginx --gid nginx --plugins http,python --limit-as 512
autostart=false
autorestart=unexpected
stdout_logfile=/var/log/uwsgi/stdout.log
stdout_logfile_maxbytes=0
stderr_logfile=/var/log/uwsgi/stderr.log
stderr_logfile_maxbytes=0
exitcodes=0
environment = HOME="/app", USER="nginx"]

这正是我所需要的!

对于任何发现此问题的人,您可能需要在app容器上使用supervisord.conf看起来像:

[supervisord]
nodaemon=true

[supervisorctl]

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[inet_http_server]
port=127.0.0.1:9002
username=user
password=password

[program:uwsgi]
directory=/app
command=/usr/sbin/uwsgi --ini /app/app.ini --uid nginx --gid nginx --plugins http,python --limit-as 512
autostart=false
autorestart=unexpected
stdout_logfile=/var/log/uwsgi/stdout.log
stdout_logfile_maxbytes=0
stderr_logfile=/var/log/uwsgi/stderr.log
stderr_logfile_maxbytes=0
exitcodes=0
environment = HOME="/app", USER="nginx"]

您可以设置inet_http_server来侦听套接字。您可以链接容器以便能够通过主机名访问它们。