在另一个docker容器内运行docker容器?

时间:2015-02-15 18:47:35

标签: node.js unix exec docker boot2docker

我尝试在另一个包含的docker环境中创建一个包含的docker环境,并通过NodeJS的exec函数调用它。

我已经阅读了Docker文档,据我所知,这是通过在启动容器时传递--privileged标志来实现的。

当我在Mac上进行开发时,我安装了boot2docker以使docker正常工作,因此我不确定如何设置此--privileged标志。

这是我到目前为止编写的代码:

var st = 'docker run virtual_machine ls'

//log the statement in console (test)
console.log(st);

//execute the Docker command
child = exec(st,
function (error, stdout, stderr) {
  console.log('stdout: ' + stdout);
  console.log('stderr: ' + stderr);
  if (error !== null) {
      console.log('exec error: ' + error);
  }
});

但这是我得到的输出(错误):

stdout: 
stderr: time="2015-02-15T18:27:15Z" level="fatal" msg="Post http:///var/run/docker.sock/v1.17/containers/create: dial unix /var/run/docker.sock: no such file or directory. Are you trying to connect to a TLS-enabled daemon without TLS?" 

exec error: Error: Command failed: time="2015-02-15T18:27:15Z" level="fatal" msg="Post http:///var/run/docker.sock/v1.17/containers/create: dial unix /var/run/docker.sock: no such file or directory. Are you trying to connect to a TLS-enabled daemon without TLS?"

如何让这个exec调用工作?它是否像设置旗帜一样简单?如果是这样,我如何在boot2docker中执行此操作?

由于

2 个答案:

答案 0 :(得分:1)

当您运行上面运行NodeJS代码的docker容器时,通常会使用--privileged标志,而不是在启动执行ls的新容器时。但是,在这种情况下,您不应该使用--privileged,因为您的新容器并不需要它。在运行NodeJS容器时,您可能只是缺少docker socket bind mount:

docker run --name nodeJS -v /var/run/docker.sock:/var/run/docker.sock ...

答案 1 :(得分:1)

例如,

docker run --rm \
  -v /var/run/docker.sock:/run/docker.sock \
  -v $(which docker):/bin/docker \
  --privileged \
  node:0.12 node my_script.js