如何在 Docker 下使用 Node Red 访问主机中的文件

How to acces a file in the host using Node Red under Docker

我在 ubuntu 的 Docker 容器中 运行ning node-red,我想从主机读取一个 csv 文件。

我使用了 git 中心存储库 node-red docker/wiki/permissions-and-persistence 中有关权限和持久性的说明。这里的代码行与结果:

  1. 我查看了uid=1000的用户,并在该用户下创建了bind挂载的目录。之后我查了谁是所有者并且是相同的:
ich@hier:~$ id $USER
uid=1000(ich) gid=1000(ich) Gruppen=1000(ich)
ich@hier:~$ mkdir -p /home/ich/node-red
ich@hier:~$ ls -nal /home/ich/node-red
insgesamt 12
drwxrwxr-x  3 1000 1000 4096 Apr 13 21:09 .
drwxrwxrwx 23 1000 1000 4096 Apr 13 20:48 ..
drwxr-xr-x  2 1000 1000 4096 Apr 13 21:09 data
  1. 然后我创建了 docker 容器,包括绑定安装到目录
ich@hier:~$ sudo docker container run -d -it -p 1880:1880 --name node-red -v /home/ich/node-red/data:/data --network report_net nodered/node-red
b3461d6a4e12f8d7458cf500ea23d1c74043f2e33fbd3c9e87cab17f2afeec12

我在node-red的流程很简单,就是一个时间戳,激活一个读文件节点。读取文件节点应该读取csv文件并显示在debug上。这里的代码

[
    {
        "id": "bdf3e780d80630ad",
        "type": "tab",
        "label": "Flow 2",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "ce335719d89260c3",
        "type": "inject",
        "z": "bdf3e780d80630ad",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 180,
        "y": 100,
        "wires": [
            [
                "52d41c28b5386790"
            ]
        ]
    },
    {
        "id": "52d41c28b5386790",
        "type": "file in",
        "z": "bdf3e780d80630ad",
        "name": "ReadAlarms",
        "filename": "/home/ich/node-red/data/Alarms",
        "format": "utf8",
        "chunk": false,
        "sendError": false,
        "encoding": "none",
        "allProps": false,
        "x": 390,
        "y": 100,
        "wires": [
            [
                "cc3b34b5725078d1"
            ]
        ]
    },
    {
        "id": "cc3b34b5725078d1",
        "type": "debug",
        "z": "bdf3e780d80630ad",
        "name": "",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 610,
        "y": 100,
        "wires": []
    }
]

结果是“错误:ENOENT:没有那个文件或目录,打开'/home/ich/node-red/data/Alarms'”。但是文件在那里,如果我在本地使用 node-red,它可以工作并且可以读取文件。

我也尝试过用另一个流程在数据文件夹中写入一个文件,

[
    {
        "id": "2b699dfbc6d1d4a8",
        "type": "tab",
        "label": "Flow 1",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "9c9c3702e8276f8b",
        "type": "inject",
        "z": "2b699dfbc6d1d4a8",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 160,
        "y": 120,
        "wires": [
            [
                "62d2c90df60f9387"
            ]
        ]
    },
    {
        "id": "62d2c90df60f9387",
        "type": "function",
        "z": "2b699dfbc6d1d4a8",
        "name": "RandomArray",
        "func": "const num=[];\nvar i;\n\nfor (i=0; i<3; i++){\n    \nnum[i] = Math.floor(Math.random() * 11);\n\n}\n\nrandArray = {payload: num}\n\nreturn randArray;\n",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 360,
        "y": 120,
        "wires": [
            [
                "116160c9d246d3b3"
            ]
        ]
    },
    {
        "id": "116160c9d246d3b3",
        "type": "file",
        "z": "2b699dfbc6d1d4a8",
        "name": "",
        "filename": "/home/ich/node-red/testDocker.txt",
        "appendNewline": true,
        "createDir": true,
        "overwriteFile": "false",
        "encoding": "none",
        "x": 640,
        "y": 120,
        "wires": [
            [
                "0a65dd6c28013d82"
            ]
        ]
    },
    {
        "id": "0a65dd6c28013d82",
        "type": "debug",
        "z": "2b699dfbc6d1d4a8",
        "name": "",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 910,
        "y": 120,
        "wires": []
    }
]

结果是“创建文件失败:错误:EACCES:权限被拒绝,mkdir '/home/ich/node-red/data' 当我 运行 它在本地工作时。

我已经检查过,node-red 正在将流程和已安装的模块保存在目录中,当我删除容器并创建一个具有相同绑定的新容器时,流程就在那里。因此 node-red 具有在文件夹中写入和读取的权限(至少是流和模块)。

我在 Ubuntu 20.Ubuntu 的机器中 运行 在 Docker 下使用 node-red。

有谁知道我在这里错过了什么?在“写入文件”和“读取文件”节点的容器外读写文件是否需要其他权限?欢迎任何帮助;-)

我希望这不是太多的文字需要阅读,并且您已经掌握了所有信息。如果您还有其他需要,请随时写信。

谢谢!

您无法访问位于 /home/ich/node-red/data/Alarms 的文件,因为该路径不存在 Docker 容器中。

当您使用 -v /home/ich/node-red/data:/data 命令行参数将卷添加到 Docker 容器时,您有效地将 /home/ich/node-red/data 映射到容器内的路径 /data。因此,要访问名为 Alarms 的文件,您需要在 Node-RED 中使用的路径是 /data/Alarms

简而言之,Node-RED 中的所有路径都需要相对于 /data