手动创建的 NFS 卷挂载但显示空内容

NFS volume created manually mounts but shows empty contents

服务器:docker ubuntu, 18.06.3-ce 本地:docker for mac, 19.03.13

我已经在 swarm 中手动创建了一个卷,用于远程 nfs 服务器。当我尝试在服务中安装此卷时它似乎可以工作,但内容为空并且任何写入 似乎 都成功(调用代码不会崩溃),但字节消失了.甚至 /dev/null.

当我在撰写文件中声明一个类似的卷时,它起作用了。我能找到的唯一区别是标签“com.docker.stack.namespace”。

docker volume create --driver local \
    --opt type=nfs \
    --opt o=addr=10.0.1.100 \
    --opt device=:/data/ \
    my_nfs
version: "3.5"

services:
  my-api:
    volumes:
      - "compose_nfs:/data1/"  # works fine
      - "externl_nfs:/data2/"  # empty contents, forgotten writes

volumes:
  externl_nfs: 
    external: true
  compose_nfs:
    driver: local
    driver_opts: 
      type: nfs
      o: addr=10.0.1.100
      device: ":/data/"

检查网络时,它们是相同的,除了那个标签。

{
    "CreatedAt": "2020-20-20T20:20:20Z",
    "Driver": "local",
    "Labels": {
        # label missing on the manually created one
        "com.docker.stack.namespace": "stackie"
    },
    "Mountpoint": "/var/lib/docker/volumes/externl_nfs/_data",
    "Name": "compose_nfs",
    "Options": {
        "device": ":/data/",
        "o": "addr=10.0.1.100",
        "type": "nfs"
    },
    "Scope": "local"
}

回答这个问题,因为它是 docker 的旧版本,考虑到 NFS 部分,可能与大多数人不相关。

这似乎是 docker/swarm 中的某种错误。

  1. 在 swarm 上创建一个 NFS 卷(通过 api,从远程)
  2. 联系的管理器节点上的音量正确
  3. 卷缺少所有其他工作节点上的 options

作为一些奇怪的副作用,音量似乎起作用了。它可以挂载,写入成功没有问题,但写入的所有字节都消失了。读取工作但每个文件都“未找到”,考虑到写入消失,这是合乎逻辑的。

关于经理:

> docker network inspect external_nfs
[{
    "CreatedAt": "2020-11-03T15:56:44+01:00",
    "Driver": "local",
    "Labels": {},
    "Mountpoint": "/var/lib/docker/volumes/externl_nfs/_data",
    "Name": "externl_nfs",
    "Options": {
        "device": ":/data/",
        "o": "addr=10.0.1.100",
        "type": "nfs"
    },
    "Scope": "local"
}]

工作人员:

> docker network inspect external_nfs
[{
    "CreatedAt": "2020-11-03T16:22:16+01:00",
    "Driver": "local",
    "Labels": {},
    "Mountpoint": "/var/lib/docker/volumes/externl_nfs/_data",
    "Name": "externl_nfs",
    "Options": null,
    "Scope": "local"
}]

如果您使用外部卷,swarm 将推迟为您创建该卷。卷对于创建它们的节点也是本地的,因此您必须在 swarm 可以安排此作业的每个节点上创建该卷。出于这个原因,许多人会将卷的创建委托给 swarm 模式本身,并将定义放在组合文件中。因此,在您的示例中,在安排服务之前,在每个节点上 运行:

docker volume create --driver local \
    --opt type=nfs \
    --opt o=addr=10.0.1.100 \
    --opt device=:/data/ \
    external_nfs

否则,当服务被安排在一个没有定义卷的节点上时,swarm 似乎会创建容器,并且该创建命令会生成一个默认的命名卷,将内容存储在该本地节点上(我也可以请参阅 swarm 由于缺少卷而未能安排服务,但您的示例显示否则)。