手动创建的 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 中的某种错误。
- 在 swarm 上创建一个 NFS 卷(通过 api,从远程)
- 联系的管理器节点上的音量正确
- 卷缺少所有其他工作节点上的
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 由于缺少卷而未能安排服务,但您的示例显示否则)。
服务器: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 中的某种错误。
- 在 swarm 上创建一个 NFS 卷(通过 api,从远程)
- 联系的管理器节点上的音量正确
- 卷缺少所有其他工作节点上的
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 由于缺少卷而未能安排服务,但您的示例显示否则)。