将 NFS docker 卷中的单个文件挂载到容器中

Posted

技术标签:

【中文标题】将 NFS docker 卷中的单个文件挂载到容器中【英文标题】:Mounting a single file from an NFS docker volume into a container 【发布时间】:2019-04-06 09:25:40 【问题描述】:

示例(为简洁起见省略了许多选项):

version: "3"
volumes:
  traefik:
    driver: local
    driver_opts:
      type: nfs
      o: "addr=192.168.1.100,soft,rw,nfsvers=4,async"
      device: ":/volume/docker/traefik"
services:
  traefik:
    volumes:
      - traefik/traefik.toml:/traefik.toml

由于没有名称为 traefik/traefik.toml 的卷而出现此错误,这意味着卷名必须是文件的完整路径(即您不能将路径附加到卷名)?

尝试设置device: ":/volume/docker/traefik/traefik.toml" 只会返回not a directory 错误。

有没有办法获取单个文件并将其挂载到容器中?

【问题讨论】:

【参考方案1】:

您不能在命名卷中挂载文件或子目录,源是命名卷或主机路径。 NFS 本身以及您在 Linux 中挂载的大多数文件系统都要求您挂载整个文件系统,而不是单个文件,当您进入 inode 级别时,这通常是一件非常好的事情。

我能想到的剩余选项是将整个目录安装在容器内的其他位置,并符号链接到您想要的文件。或者通过 NFS 将目录挂载到主机,然后将主机挂载(绑定挂载)到特定文件。

但是考虑到您提供的示例,使用 docker 配置将是我理想的解决方案,完全删除 NFS 挂载,并获取文件的只读副本,该副本会自动分发到运行容器的任何节点。

有关配置的更多详细信息:https://docs.docker.com/engine/swarm/configs/

【讨论】:

【参考方案2】:

我相信我找到了问题!

错误:

   volumes:
      - traefik/traefik.toml:/traefik.toml

正确:

   volumes:
      - /traefik/traefik.toml:/traefik.toml      

以“/”开始卷

【讨论】:

这只会挂载根文件夹 /traefik,而不是 traefik nfs 卷

以上是关于将 NFS docker 卷中的单个文件挂载到容器中的主要内容,如果未能解决你的问题,请参考以下文章

1.6 Docker-数据管理

单个文件卷挂载为 Docker 中的目录

在docker挂载卷中管理nginx vhost文件权限

解决 Docker 数据卷挂载的文件权限问题

如何将docker容器的根目录挂载为NFS挂载点

Java 中的 FileLock 在 Docker 挂载卷中不起作用