最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

使用JavaScript 节点上泊坞窗访问文件

运维笔记admin10浏览0评论

使用JavaScript /节点上泊坞窗访问文件

使用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在未来的方式执行搬运工人容器内的命令:

  1. 启用对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-reloadservice docker restart。现在,你应该能够访问http://127.0.0.1:2375的API - 你应该得到{ "message": "page not found" }作为响应。
  2. 使用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}"}

  1. 执行先前创建的命令:
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是一个数组,所以可以指定多个命令。

发布评论

评论列表(0)

  1. 暂无评论