服务器: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"
}
答案 0 :(得分:0)
对此进行回答,因为它是docker的较旧版本,考虑到NFS部分,可能与大多数人无关。
似乎是docker / swarm中的某种错误。
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由于缺少卷而无法安排服务,但您的示例显示为其他)。