如何在 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 中有关权限和持久性的说明。这里的代码行与结果:
- 我查看了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
- 然后我创建了 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
我在 ubuntu 的 Docker 容器中 运行ning node-red,我想从主机读取一个 csv 文件。
我使用了 git 中心存储库 node-red docker/wiki/permissions-and-persistence 中有关权限和持久性的说明。这里的代码行与结果:
- 我查看了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
- 然后我创建了 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