我正在编写一个使用 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 文档中的示例中将其拼凑起来。我只是不知道我哪里出错了。作为引用,这里是没有 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 配置。
关于node.js - 使用共享卷在 docker 上执行 `ls` 会导致 "No such file or directory",我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27907262/