使用JavaScript /节点上泊坞窗访问文件
有没有办法在执行过程中以编程方式访问容器(码头工人)上的文件。我已经使用节点泊坞窗-API刚刚设置的东西,在一审中,并建立连接的尝试:
const docker = new Docker({
"host": "tcp://docker:port"
});
// List
docker.container.list()
// Inspect
.then(containers => containers[0].status())
.then(container => container.top())
.then(processes => console.log(processes))
.catch(error => console.log(error));
其中,“端口”是4位数的端口号。但我收到此错误信息:
{ Error: connect ECONNREFUSED 127.0.0.1:80
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1081:14)
errno: 'ECONNREFUSED',
code: 'ECONNREFUSED',
syscall: 'connect',
address: '127.0.0.1',
port: 80 }
更新:我已经做了类似的东西在Java中与dockerjava使用 -
ExecCreateCmdResponse execCreateResp = dck.execCreateCmd(cid).withCmd("bash")
.withAttachStderr().withAttachStdout().withAttachStdin().withTty(false).exec();
HashMap<String, String> headers = new HashMap<>();
headers.put("Content-Type", "application/json");
HttpHijack ws = new HttpHijack(new URI("http://127.0.0.1:2376/v1.19/exec/" + execCreateResp.getId() + "/start"));
String payload = "{\"Detach\": false,\"Tty\": false}";
ws.post(headers, payload);
然后复制使用容器中的文件:
try (TarArchiveInputStream tarStream = new TarArchiveInputStream(
docker.copyArchiveFromContainerCmd(containerId, "/home/seluser/Downloads/" + fileName).exec())) {
unTar(tarStream, new File(filePath));
return;
}catch(NotFoundException e){
e.printStackTrace();
}
但我似乎无法找到一种方法来实现上述使用JavaScript /节点
回答如下:考虑到容器内的文件,是短暂的,你要小心,如果你的代码以某种方式依赖于文件。
最好的做法是使用docker volumes来存储数据。在你的情况,如果你能在一个码头工人卷存储文件,那么你可以从另一个容器中运行你的代码,看到文件从它。因此,容器将共享相同的存储,这不是短暂的,会生存容器重新启动。
如果码头工人卷是不是你的话,那么在我心中的一个想法是Docker REST API,尤其是与Exec方法玩。
使用这种方法,你可以执行Linux的容器中的命令。
更新1:如果你的程序在主机上运行,你需要有访问由搬运工人量生成的数据,你也可以绑定主机目录泊坞窗容器内的目录。
举个例子:docker run -v /host/folder:/container/folder <your_image>
这样,在泊坞窗文件夹中的任何变化都会对文件夹在您的主机中反映出来 - 这样你就可以访问它们。
Read more
更新2:你可以使用泊坞REST API在未来的方式执行搬运工人容器内的命令:
- 启用对REST API TCP访问:编辑
/lib/systemd/system/docker.service
和改变下一行:ExecStart=/usr/bin/dockerd -g /data/docker -H fd://
到ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375
并保存文件。然后systemctl daemon-reload
和service docker restart
。现在,你应该能够访问http://127.0.0.1:2375
的API - 你应该得到{ "message": "page not found" }
作为响应。 - 使用REST API,例如创建一个exec对象:
curl --header "Content-Type: application/json" \
--request POST \
--data '{"AttachStdout": true,"AttachStderr": true,"Cmd": ["date"]}' \
http://127.0.0.1:2375/v{dockerVersion}/containers/{containerId}/exec
这里:
dockerVersion
- 你的泊坞窗引擎的版本,可以使用docker version
命令来获得(参见版FO服务器,在我的情况下,它是1.38 - 所以在URL就会像v1.38不要忘记v
)containerId
- 你在泊坞窗容器的ID,可以通过以下命令检索:curl http://127.0.0.1:2375/v{dockerVersion}/containers/json
在回答/containers/{containerId}/exec
你应该得到的东西,如:{"Id": "{objectId}"}
- 执行先前创建的命令:
curl --header "Content-Type: application/json" \
--request POST \
--data '{"Detach": false,"Tty": false}' \
http://127.0.0.1:2375/v{dockerVersion}/exec/{objectId}/start
这里:
objectId
- ID从码头工人API在上一步中返回(步骤2)
作为回应,你应该得到一个纯文本 - 你的命令的输出。
注:在JSON体内的Cmd
是一个数组,所以可以指定多个命令。