网络共享
许多工业现场都把文件放在本地网络中的 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/CIFS | NFS |
|---|---|---|
| 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 用户运行,请把它们设置为该用户,否则写入会失败。