Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.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

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
Node.js 在docker上使用共享卷执行'ls',结果是';没有这样的文件或目录;_Node.js_Docker - Fatal编程技术网

Node.js 在docker上使用共享卷执行'ls',结果是';没有这样的文件或目录;

Node.js 在docker上使用共享卷执行'ls',结果是';没有这样的文件或目录;,node.js,docker,Node.js,Docker,我正在编写一个使用dockernode作为Docker客户端的节点程序。程序将创建一个容器,其中的卷在容器启动时绑定到主机上的目录。一开始,我试图打印共享卷的内容,以证明它工作正常。但是,我一直得到(ls:/tmp/app:没有这样的文件或目录) 这是我的密码 var Docker = require('dockerode'), docker = new Docker(), mkdirp = require('mkdirp'), volume = (process.env

我正在编写一个使用dockernode作为Docker客户端的节点程序。程序将创建一个容器,其中的卷在容器启动时绑定到主机上的目录。一开始,我试图打印共享卷的内容,以证明它工作正常。但是,我一直得到
(ls:/tmp/app:没有这样的文件或目录

这是我的密码

var Docker = require('dockerode'),
    docker = new Docker(),
    mkdirp = require('mkdirp'),
    volume = (process.env.HOME || process.env.HOMEPATH || process.env.USERPROFILE) + '/' + Date.now();

function handleError(action, err) {
    if (err) {
        console.error('error while ' + action + '...');
        console.error(err);
    }
}

mkdirp.sync(volume);

docker.createContainer({
    Image: 'ubuntu',
    Volumes: {
        '/tmp/app': {}
    }
}, function(err, container) {
    handleError('building', err);

    container.start({
        Binds: [volume + ':/tmp/app']
    }, function(err, data) {
        handleError('starting', err);

        container.exec({
            AttachStdout: true,
            AttachStderr: true,
            Tty: false,
            Cmd: ['/bin/ls', '/tmp/app']
        }, function(err, exec) {
            handleError('executing `ls /tmp/app`', err);

            exec.start(function(err, stream) {
                handleError('handling response from `ls /tmp/app`', err);

                stream.setEncoding('utf8');
                stream.pipe(process.stdout);
            });
        });
    });
});
我在没有exec的情况下成功地做到了这一点,我创建了容器,附加到它,用
ls
命令启动它,等待它完成,然后杀死它并删除它。但我希望使用exec,以便在容器运行时可以发出多个命令。我一直在尝试从dock中的示例中将其组合起来侵蚀库和Docker远程API文档。我只是不知道哪里出了问题

以下是不带exec的代码供参考

docker.createContainer({
    Image: 'ubuntu',
    Cmd: ['/bin/ls', '/tmp/app'],
    Volumes: {
        '/tmp/app': {}
    }
}, function(err, container) {
    console.log('attaching to... ' + container.id);

    container.attach({stream: true, stdout: true, stderr: true, tty: true}, function(err, stream) {
        handleError('attaching', err);

        stream.pipe(process.stdout);

        console.log('starting... ' + container.id);

        container.start({
            Binds: [volume + ':/tmp/app']
        }, function(err, data) {
            handleError('starting', err);
        });

        container.wait(function(err, data) {
            handleError('waiting', err);

            console.log('killing... ' + container.id);

            container.kill(function(err, data) {
                handleError('killing', err);

                console.log('removing... ' + container.id);

                container.remove(function(err, data) {
                    handleError('removing', err);
                });
            });
        });
    });
});

我已经为同一问题挣扎了一段时间,但我找到了解决方案。远程API似乎不接受将参数作为一个字符串的命令,但您必须将每个参数拆分为Cmd属性数组中的新标记;例如,使用gcc:

"Cmd":["/bin/bash","-c","gcc -Wall -std=c99 hello.c -o hello.bin"]
经过此修改后,它可以正常工作


官方文档可能更适合远程API配置。

请忽略正在开发的回调地狱。它只是临时的。ubuntu映像的CMD是bash,没有附加bash exits,您是否尝试过执行该命令。从长时间运行的进程开始?这样我就可以通过仅将exec命令更改为
Cmd:['/bin/ls','/']
。问题似乎是容器中的卷(
Volumes:{'/tmp/app':{}
)未创建。是否有原因导致默认bash命令不允许创建该目录?或者可能正在创建卷,但在发出exec命令时该卷不可用?是否可能是容器使用绑定启动,然后在为exec调用重新创建之前停止,而不使用绑定?我没有使用ubuntu映像,而是使用dockerfile/mysql映像来保证进程将无限期地运行。一旦我进行了更改,它就如预期的那样工作。因此,在使用ubuntu映像时,对
start
的调用不能保持容器运行。当我尝试运行时,容器不能运行调用
exec
。我所有的Cmd属性都被分成多个参数。
Cmd:['/bin/ls','/tmp/app']
我不明白这个答案对这个问题有什么帮助。