ネットワーク共有
多くの産業現場では、ファイルはローカルネットワーク上のNASやWindowsファイルサーバーに置かれています — スキャン結果は\\nas\productionに書き込まれ、レポートは共有フォルダから読み取られ、機械同士はSMBでファイルをやり取りします。IronFlockアプリはこうした共有をコンテナに直接マウントできるため、コードからはローカルディレクトリと同じように読み書きできます。
これはファイルストレージのオンプレミス側の対応物です:ファイルストレージがプラットフォームのマネージドオブジェクトストレージであるのに対し、ネットワーク共有は顧客自身のLAN上にある顧客自身のファイルサーバーです。ファイルを顧客の既存インフラに置く必要がある場合は、共有を使用してください。
サポートされるプロトコルは2つです:SMB/CIFS(Windowsファイルサーバー、ほぼすべてのNAS)とNFS(Linuxベースのサーバーで一般的)です。
仕組み
マウントは、Docker組み込みのlocalボリュームドライバーを使って、アプリのdocker-compose.ymlに名前付きボリュームとして宣言します。コンテナの起動時に、デバイス上のDockerエンジン自身がマウントを実行します — デバイスに何かをインストールする必要はなく、デバイスのユーザーがコマンドラインに触れることもありません。
共有のアドレスと資格情報は、Composeファイルには書き込みません。これらは${VARIABLE}プレースホルダーであり、アプリパラメータからデバイスごとに値が埋め込まれます — 他のあらゆるデバイスごとの設定と同じ仕組みです。ユーザーは各デバイスのアプリのパラメータフォームで共有を設定し(またはデバイスグループごとに一度だけ設定し)、アプリを再起動します。
ボリュームの宣言
docker-compose.ymlにdriver_opts付きの名前付きボリュームを追加し、必要とするサービスにマウントします:
services:
app:
build: .
volumes:
- netshare:/mnt/share
restart: unless-stopped
volumes:
netshare:
# Docker volumes keep the settings they were created with. Putting the
# revision parameter into the volume name means: bump the revision, restart
# the app, and a fresh volume with the current settings is created.
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はプラットフォームが自動的に提供する標準変数の1つで、ボリューム名をアプリのスコープに限定します。
設定可能にする
プレースホルダーを.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."各デバイスで、ユーザーはアプリのパラメータにあるフォームに入力して保存し、アプリを再起動します。パラメータをデバイスグループのレベルで設定すれば、フリート全体を同じファイルサーバーに対して一度の操作で設定できます。
後から設定を変更する
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)を推奨します — 必要なオプションはこの1つだけで、デバイス上に追加のサービスも不要です。
デバイスのサポート状況
| デバイスタイプ | SMB/CIFS | NFS |
|---|---|---|
| Linuxデバイス(カスタムLinuxインストール) | ✓ | ✓ |
| Windowsデバイス(Docker Desktop) | ✓ | ✓ |
| FlockOSデバイス | まだ利用できません | まだ利用できません |
Windowsデバイスでは、マウントはDocker DesktopのLinux環境の内部で行われます。この環境には両プロトコルのクライアントが同梱されているため、デバイスのLAN上のSMBサーバーへの到達を含め、そのままで動作します。Linuxデバイスでは、標準的なディストリビューションのカーネルがプロトコルサポートを備えており、パッケージのインストールは不要です。FlockOSでのサポートには、まだリリースされていないオペレーティングシステムのアップデートが必要です — FlockOSでこの機能が必要な場合はご相談ください。
マウントには最新のデバイスエージェントが必要です。エージェントは自動的に自己更新されます。
知っておくべきこと
- 未設定のデバイス:パラメータが入力されるまで、アプリは起動に失敗し、ライブログにマウントエラーが表示されます。共有なしでも動作すべきアプリの場合は、無条件にマウントしないでください — 代わりにコード内でパラメータを読み取り、共有に依存する機能をスキップしてください。
- 資格情報:ファイルサーバー上に、この共有だけにアクセスできる専用アカウントを作成し、それをパラメータに使用してください。パスワードはプラットフォームのUIではマスクされますが、マウントを実行するデバイスには渡されます — グローバルな管理者資格情報ではなく、デバイスローカルな情報として扱ってください。
- パスワードにカンマは不可:SMBのオプションはカンマ区切りの文字列として渡されるため、カンマを含むパスワードはマウントを壊します。共有アカウントのパスワードは、それを踏まえて選んでください。
- サーバーアドレス:IPアドレスか、現場のDNSで解決できる名前を使用してください。
nas.localのようなmDNS名は、Dockerエンジンの内部からは解決できないことがよくあります。 - ファイアウォール:デバイスはTCP 445(SMB)またはTCP 2049(NFS)でファイルサーバーに接続します。セグメント化された工場ネットワークでは、この経路が開いていることを確認してください。
- ファイルの所有権(SMB):コンテナ内では、ファイルはマウントオプションの
uid/gidが所有するものとして見えます。プロセスをroot以外のユーザーで実行している場合は、uid/gidをそのユーザーに合わせて設定してください。さもないと書き込みが失敗します。