手动安装的NFS卷已挂载,但内容为空

时间:2020-11-02 21:17:39

标签: docker docker-swarm

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

我已经在群集中手动创建了一个卷到远程nfs服务器。当我尝试将此卷挂载到服务中时,它似乎可以工作,但是内容为空,并且所有写入 seem 都成功(调用代码不会崩溃),但是字节不见了。甚至是/ dev / null。

当我在compose文件中声明一个类似的卷时,它起作用了。我可以找到的唯一区别是标签“ 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"
}

2 个答案:

答案 0 :(得分:0)

对此进行回答,因为它是docker的较旧版本,考虑到NFS部分,可能与大多数人无关。

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

  1. 在群集上(通过api,从远程)创建NFS卷
  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"
}]

答案 1 :(得分:0)

如果您使用外部卷,则swarm会将创建该卷的时间推迟给您。卷在创建它们的节点上也是本地的,因此您必须在swarm可以调度此作业的每个节点上创建该卷。因此,许多人会将卷创建委托给本身的群集模式,然后将定义放入撰写文件中。因此,在您的示例中,在安排服务之前,在每个节点上 运行:

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

否则,当服务在未定义卷的节点上调度时,似乎swarm将创建容器,并且create命令将生成一个默认的命名卷,将内容存储在该本地节点上(我也可以看到swarm由于缺少卷而无法安排服务,但您的示例显示为其他)。