Node.js Can';通过NodeJS调用脚本时看不到Docker守护进程?

Node.js Can';通过NodeJS调用脚本时看不到Docker守护进程?,node.js,docker,child-process,Node.js,Docker,Child Process,我使用NodeJS和child\u进程启动部署脚本。在部署脚本中,有几个对Docker的调用。该脚本成功运行,但问题是,当通过NodeJS调用该脚本时,它表示“无法连接到Docker守护进程”。不过,当我手动调用该脚本时,它就没事了 相关的NodeJS脚本: var cp = require('child_process'); cp.exec('deploy.sh', {shell: '/bin/bash', cwd: '/deploy', uid: userid.uid('ubuntu'),

我使用NodeJS和
child\u进程
启动部署脚本。在部署脚本中,有几个对Docker的调用。该脚本成功运行,但问题是,当通过NodeJS调用该脚本时,它表示“无法连接到Docker守护进程”。不过,当我手动调用该脚本时,它就没事了

相关的NodeJS脚本:

var cp = require('child_process');

cp.exec('deploy.sh', {shell: '/bin/bash', cwd: '/deploy', uid: userid.uid('ubuntu'), gid: userid.gid('ubuntu')}, function(err, stdout, stderr) {
    console.log("Output: " + stdout);
});
你知道这是为什么吗?怎么解决?我已经检查了输出,并且
whoami
返回了正确的用户

编辑:我尝试用Ruby运行脚本:

userdata = Etc.getpwnam('ubuntu')
stdout, stderr, status = Open3.capture3("./deploy.sh", :chdir=>"/deploy", :uid => userdata.uid, :gid => userdata.gid)
我得到了同样的结果——Docker守护进程没有运行。在
/var/run/
中:

drwx------  4 root       root         80 Jan 20 21:32 docker/
-rw-r--r--  1 root       root          5 Jan 20 22:57 docker.pid
srw-rw----  1 root       docker        0 Jan 20 22:57 docker.sock=

总的来说,这整件事让我觉得这是一个权限问题。

docker是否在本地运行?您如何连接到守护进程(tcp或套接字连接)?如果守护程序受TLS保护,则NodeJS可能未使用用于配置连接的环境变量。在这种情况下,可以使用配置文件,也可以显式地将正确的选项作为flag@thaJeztah:是,Docker正在本地运行。但你让我思考。我在/var/run中查找,发现:
根docker 0 Jan 20 22:57 docker.sock
。因此,
docker.sock
属于docker组中的root用户。接下来,如果我将
gid
改为使用
docker
而不是
ubuntu
,docker将加载,但如果我这样做,我的脚本将失败。我已尝试设置
导出DOCKER\u主机=”unix:///var/run/docker.sock“
在许多地方,包括上面的NodeJS exec,这也没有效果。您能否尝试在子进程中运行
env
,以确认它具有正确的环境变量?还能够发布
deploy.sh
脚本吗?可能值得尝试运行
docker ps
或一些简单的方法来消除可能的嫌疑犯。@AndyShinn:
env
显示很少-
PWD
\uuu
,以及
docker\u主机
,如果我指定的话
deploy.sh
启动一个构建脚本,该脚本执行诸如
docker build-tapi.
docker tag-fapi$docker\u repo/api
之类的操作。如果我在脚本中放入
docker ps
,它会给我同样的“无法连接”错误。如果我将
uid
gid
设置为“root”,则
docker ps
会给出一个输出-但是由于其他权限,脚本的其余部分会出错。连接到守护进程的所有选项也可以作为标志提供;环境变量只是为了方便起见。例如
docker-Hunix:///var/run/docker.sock 版本
。还可以提供其他选项,例如
--tlscert
。请注意,这些是“顶级”选项,因此应该放在运行的子命令之前(在本例中为
info