node.js - 在具有共享卷的 docker 上执行 `ls` 结果为 "No such file or directory"

标签 node.js docker

我正在编写一个使用 dockernode 作为 Docker 客户端的 Node 程序。该程序创建一个容器,其中包含一个卷,该卷在容器启动时绑定(bind)到主机上的一个目录。一开始,我尝试打印共享卷的内容以证明它工作正常。但是,我不断收到 (ls:/tmp/app: No such file or directory

这是我的代码...

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 的方法,这样我就可以在容器运行后发出多个命令。我一直在尝试将 dockerode 库和 Docker 远程 API 文档中的示例拼凑起来。我只是不知道哪里出错了。

作为引用,这里是没有执行的代码...

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);
                });
            });
        });
    });
});

最佳答案

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

"Cmd":["/bin/bash","-c","gcc -Wall -std=c99 hello.c -o hello.bin"]

此修改后它可以正常工作。

对于远程 API 配置,官方文档可能会更好。

关于node.js - 在具有共享卷的 docker 上执行 `ls` 结果为 "No such file or directory",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27907262/

相关文章:

windows - 是否可以在 Windows 主机上容器化 Windows GUI 应用程序?

sql-server - 在node.js应用程序中创建mssql连接池

node.js - NodeJS & SSL - "bad password read"

javascript - 用户从开始时间起每 X 小时创建一次计划

docker - 将设备添加到 docker 容器时如何转义冒号?

docker - 如何生成docker镜像Layer DiffID?

docker - cp : cannot stat 'Pipfile' : No such file or directory in Docker build

javascript - 如何将 MongooseArray.prototype.pull() 与 typescript 一起使用?

javascript - Electron :按住元键的同时拖动范围控制

docker - 在用户指定的位置初始化卷