Skip to Content
IoT 应用开发网络共享

网络共享

许多工业现场都把文件放在本地网络中的 NAS 或 Windows 文件服务器上——扫描结果写入 \\nas\production,报表从共享文件夹中读取,机器之间通过 SMB 交换文件。IronFlock 应用可以把这样的共享直接挂载进自己的容器,让你的代码像读写本地目录一样读写它。

这是文件存储在本地侧的对应物:文件存储是平台托管的对象存储,而网络共享是客户自有局域网上客户自己的文件服务器。当文件必须落在客户现有的基础设施中时,就使用网络共享。

支持两种协议:SMB/CIFS(Windows 文件服务器,以及几乎所有 NAS)和 NFS(常见于基于 Linux 的服务器)。

工作原理

挂载在应用的 docker-compose.yml 中声明为一个命名卷,使用 Docker 内置的 local 卷驱动。容器启动时,设备上的 Docker 引擎会自行执行挂载——设备上无需安装任何东西,设备用户也完全不需要接触命令行。

共享的地址和凭据不会写进你的 compose 文件,而是以 ${VARIABLE} 占位符的形式存在,按设备从应用参数中填入——与其他所有按设备生效的设置走的是同一套机制。用户在每台设备上通过应用的 Parameters 表单配置共享(或按设备组一次性配置),然后重启应用。

声明卷

docker-compose.yml 中添加一个带 driver_opts 的命名卷,并把它挂载到需要它的服务中:

services: app: build: . volumes: - netshare:/mnt/share restart: unless-stopped volumes: netshare: # Docker 卷会一直保留创建时的设置。把修订号参数放进卷名意味着: # 调高修订号、重启应用,就会按当前设置创建一个全新的卷。 name: "${APP_NAME}_share_r${SHARE_REV:-1}" driver: local driver_opts: type: cifs device: "//${SHARE_HOST}/${SHARE_NAME}" o: "username=${SHARE_USER},password=${SHARE_PASSWORD},vers=3.0,uid=1000,gid=1000"

此后,你的代码就可以把 /mnt/share 当作一个普通目录来使用。

值得理解的几个要点:

字段含义
device共享的地址:SMB 使用 //server/sharename 形式
o挂载选项,以逗号分隔。vers=3.0 选择 SMB 协议版本;uid/gid 决定文件在容器内归哪个用户所有——请与你的进程实际运行的用户保持一致
name卷在设备上的标识。Docker 从不更改已存在的卷,因此设置的修订号是卷名的一部分——见下文
${VAR:-fallback}带默认值的 Compose 变量插值。请给每个占位符都设一个默认值(哪怕是空值),确保文件在任何情况下都能解析

APP_NAME 是平台自动提供的标准变量之一;它把卷名限定在你的应用范围内。

使其可配置

.ironflock/env-template.yml 中声明这些占位符,让用户得到一个正规的表单——密码会作为机密被掩码显示:

SHARE_HOST: label: "File server (IP or hostname)" type: text defaultValue: "" description: "The SMB server or NAS on the device's local network." SHARE_NAME: label: "Share name" type: text defaultValue: "" SHARE_USER: label: "Username" type: text defaultValue: "" SHARE_PASSWORD: label: "Password" type: text secret: true defaultValue: "" SHARE_REV: label: "Storage settings revision" type: numeric defaultValue: 1 description: "Increase by 1 whenever you change one of the settings above, then restart the app."

在每台设备上,用户在应用的 Parameters 下填写表单、保存,然后重启应用。在设备组级别设置这些参数,则可以一步完成整批设备对同一台文件服务器的配置。

后续更改设置

Docker 会在卷第一次被使用时创建它,并从那一刻起一直保留当时的设置——只修改参数并不能让已存在的卷指向新地址。这正是修订号参数的用途:更改任何共享设置后,用户把修订号加 1,然后重启应用。新的卷名会让 Docker 以当前值重新创建这个挂载。

这一切都不会影响文件服务器上的任何内容:卷只是一份挂载定义。创建它、以新修订号重建它,或是卸载应用,都绝不会删除共享上的文件。

NFS

对于 NFS 服务器,模式相同,只是 driver_opts 不同:

volumes: netshare: name: "${APP_NAME}_share_r${SHARE_REV:-1}" driver: local driver_opts: type: nfs device: ":${SHARE_PATH}" o: "addr=${SHARE_HOST},nfsvers=4"

SHARE_PATH 是导出路径(例如 /exports/production),addr 是服务器。优先选择 NFSv4(nfsvers=4)——它只需要这一个选项,设备上也不需要任何额外的服务。

设备支持

设备类型SMB/CIFSNFS
Linux 设备(自定义 Linux 安装)
Windows 设备(Docker Desktop)
FlockOS 设备暂不可用暂不可用

Windows 设备上,挂载发生在 Docker Desktop 的 Linux 环境内部,该环境自带这两种协议的客户端——因此开箱即用,包括访问设备局域网中的 SMB 服务器。在 Linux 设备上,标准发行版的内核自带协议支持,无需安装任何软件包。FlockOS 上的支持依赖一次尚未发布的操作系统更新——如果你需要在 FlockOS 上使用网络共享,请与我们联系。

挂载功能要求设备代理为最新版本;代理会自动完成更新。

注意事项

  • 未配置的设备:在参数填写完成之前,应用会因挂载错误而启动失败,错误可在其实时日志中看到。如果你的应用也必须能在没有共享的情况下运行,就不要无条件地挂载共享——改为在代码中读取参数,并跳过依赖共享的那些功能。
  • 凭据:在文件服务器上创建一个只能访问这一个共享的专用账号,并在参数中使用它。密码在平台界面中会被掩码显示,但会被交给执行挂载的设备——请把它当作设备本地的材料来对待,而不是一份全局管理员凭据。
  • 密码中不能包含逗号:SMB 挂载选项以逗号分隔的字符串传递,密码里出现逗号会破坏挂载。请据此设置共享账号的密码。
  • 服务器地址:使用 IP 地址,或站点 DNS 能够解析的名称。诸如 nas.local 之类的 mDNS 名称在 Docker 引擎内部通常无法解析。
  • 防火墙:设备通过 TCP 445(SMB)或 TCP 2049(NFS)访问文件服务器。在做了分段的工厂网络中,请确保这条链路是放行的。
  • 文件属主(SMB):容器内看到的文件归挂载选项中 uid/gid 指定的用户所有。如果你的进程以非 root 用户运行,请把它们设置为该用户,否则写入会失败。
Last updated on