我有一个应用程序,除了其他的thigns之外,它允许您在api的帮助下使用自定义运行代码来旋转坞容器,这个api也是被文档化的。
因此,在API容器中,我这样做了:
exec(`curl --unix-socket /var/run/docker.sock -H "Content-Type: application/json" -d \'{"Image": "botimage", "ExposedPorts": {"${PORT}/tcp": {"HostPort": "${PORT}"}}, "HostConfig": {"Binds": ["${dirPath}/bots/api/bots/strategies:/usr/src/bots/strategies", "${dirPath}/bots/api/database:/usr/src/bots/database", "${dirPath}/postgres/data:/usr/src/bots/data"], "NetworkMode": "bitmex_backend"}, "PortBindings": { "${PORT}/tcp": [{ "HostPort": "${PORT}" }] }, "Env": ["TOPIC=${TOPIC}","BOTNAME=${BOT_NAME}","EXEC_ENV=${EXEC_ENV}","BITMEX_KEYS=${BITMEX_KEYS}","TIME_FRAME=${TIME_FRAME}","PORT=${PORT}"], "Cmd": ["node", "app.js"]}\' -X POST http:/v1.24/containers/create?name=${BOT_NAME}`,
(err, stdout, stderr) => {
if (err) {
console.error(err)
return;
}
var id = JSON.parse(stdout).Id;
// Would this work with the name too?
logEvent(LOG_LEVELS.info, RESPONSE_CODES.LOG_MESSAGE_ONLY, `Initializing containerised strategy `)
exec(`curl --unix-socket /var/run/docker.sock -X POST http:/v1.24/containers/${id}/start`, (err, stdout, stderr) => {
if (err) {
console.error(err)
return;
}
});
});它重新启动一个新的容器,同样是动态的。
我想知道怎样才能把这个新容器从另一个容器里取下来。
从本地主机,我可以简单地做:
curl --unix-socket /var/run/docker.sock -X POST http:/v1.24/containers/test/stop
curl --unix-socket /var/run/docker.sock -X DELETE http:/v1.24/containers/test然而,当我试图从另一个码头集装箱中这样做时:
exec(`curl --unix-socket /var/run/docker.sock -X POST http:/v1.24/containers/test/stop`)
exec(`curl --unix-socket /var/run/docker.sock -X DELETE http:/v1.24/containers/test`)我得到以下错误:
{错误:命令失败: curl --unix /var/run/docker.sock -X POST http:/v1.24/-X/test/stop curl:(7)无法连接到服务器
在ChildProcess.exithandler (child_process.js:299:12) at ChildProcess.emit (events.js:193:13) at maybeClose (内部/child_process.js:999:16) at Process.ChildProcess._handle.onexit (内部/child_process.js:266:5)被杀害: false,代码: 7,信号: null,cmd:
我认为,在我构建容器时,应该使用类似于external_links的方法来获得这样的东西。
知道这是否是正确的决定吗?或者我怎么处理这个问题?德福。看上去是网络问题。
发布于 2020-03-09 07:09:21
让码头容器按照您所描述的方式控制其他码头容器的唯一方法是将码头套接字(/var/run/docker.sock)公开给“控制”容器。你可以这样做:
darkstar:~$ docker run \
-v /var/run/docker.sock:/var/run/docker.sock \
<my_image>
darkstar:~$ docker exec -u root -it <container id> /bin/bash现在,作为容器中的根用户,您可以安装对接器CLI (这不是绝对必要的,这取决于您计划如何从容器中操作对接器。另外,我假设一个类似Debian的Linux,YMMV):
root@guest:/# apt-get update
root@guest:/# apt-get -y install apt-transport-https \
ca-certificates \
curl \
gnupg2 \
software-properties-common
root@guest:/# rel=$(. /etc/os-release; echo "$ID")
root@guest:/# curl -fsSL https://download.docker.com/linux/${rel}/gpg > /tmp/dkey
root@guest:/# apt-key add /tmp/dkey
root@guest:/# add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/${rel} \
$(lsb_release -cs) stable"
root@guest:/# apt-get update
root@guest:/# apt-get -y install docker-ce我建议在这里(从主机,而不是在容器中)执行一个docker commit来保存映像的状态,这样每次进行重建时都不需要重复上面的步骤。
现在容器应该可以访问套接字:
root@guest:/# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED ...
69340bc13bb2 my_image "/sbin/tini -- /usr/…" 8 minutes ago ...这是否是一个好主意是值得商榷的。如果有什么办法可以避免的话,我建议不要这样做。这是一个安全漏洞,本质上抛出了使用容器的一些主要好处:隔离和对权限提升的控制。
https://stackoverflow.com/questions/60591891
复制相似问题