使用local_lock=all挂载NFS的Docker

7
我有一个 docker-compose.yml 文件。
volumes:
  nfs:
      driver: local
      driver_opts:
        type: nfs
        o: addr=192.168.100.1,rw
        device: ":/mnt/storage"

我的容器已挂载卷并带有以下选项:

type nfs (rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.100.1,mountvers=3,mountproto=tcp,local_lock=none,addr=192.168.100.1)

使用 local_lock=none,但我无法将此选项更改为 local_lock=all。 我尝试过:

volumes:
  nfs:
      driver: local
      driver_opts:
        type: nfs
        o: addr=192.168.100.1,rw,local_lock=all
        device: ":/mnt/storage"

并且

volumes:
  nfs:
      driver: local
      driver_opts:
        type: nfs
        o: addr=192.168.100.1,rw
        device: ":/mnt/storage"
        local_lock: all

但是什么也没有改变


如果有任何语法问题,那应该是第一个带有 o: addr=192.168.100.1,rw,local_lock=all 的设置。你删除并重新创建了该卷吗? - BMitch
@BMitch 我意识到这个问题可能来自于Linux/Ubuntu/NFS,而不是Docker本身。如果我尝试在Ubuntu中手动挂载我的卷,使用mount -o nfsvers=4,nolock ...,我仍然会在mount输出中看到local_lock=none。这是一个Ubuntu的问题吗?还是NFS 4的问题? - alexpirine
@alexpirine Docker只是将该选项传递给操作系统和NFS驱动程序,所以这是一个很有可能的情况。 - BMitch
@BMitch没错(请参见编辑后的评论)。问题在于,在docker实例内部,我遇到了“没有可用锁定”的错误消息。直接在主机上一切正常。因此,由于local_lock=all选项被忽略,某种原因导致NFS锁定无法在Docker容器内部工作...而且没有办法忽略它们。 - alexpirine
@alexpirine 在我的 man 页面中,local_lock 被列为仅适用于 nfs 2 或 3 的选项。因此,如果您正在使用 nfs4,则可能无法正常工作。 - BMitch
@BMitch 謝謝!問題的作者可能也使用了 nfs4。我正在檢查是否將一些 nfs 工具添加到 Docker 映像中可以解決“沒有可用的鎖定”問題。 - alexpirine
2个回答

0
一个解决问题的方法是在主机上直接创建NFS挂载点,然后将挂载文件夹导出到Docker卷。这样,Docker容器不再需要NFS锁。
这对于Docker Swarm来说并不是一个理想的解决方案,因为它需要在swarm集群的每个节点上维护NFS挂载点。

使用 ClusterSSH 可以帮助管理固定数量的虚拟机,或者使用 Ansible 来设置虚拟机。 - herm

0

你需要的语法是第一个选项:

volumes:
  nfs:
      driver: local
      driver_opts:
        type: nfs
        o: addr=192.168.100.1,rw,local_lock=all
        device: ":/mnt/storage"

这只是一个通过操作系统的传递。你可能没有看到任何与该卷挂载有关的差异,原因在于local_lock被列为仅适用于NFS 2或NFS 3选项,因此如果您使用的是NFS 4,则该选项可能会被忽略。


嗯,这是正确的答案,但不幸的是并没有解决问题...有没有办法在NFS 4中使用本地锁定? - alexpirine
我不相信这是nfs4中支持的功能。如果您需要此选项,则需要降级。 - BMitch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接