【问题标题】:Relative path not working with named volumes in the docker-compose.yml相对路径不适用于 docker-compose.yml 中的命名卷
【发布时间】:2017-03-22 19:43:20
【问题描述】:

我需要让命名卷使用执行docker-compose 命令的文件夹的相对路径。

这是 docker-compose.yml 中的卷定义

volumes:
  esdata1:
   driver: local 
   driver_opts:
      type: none
      device: ./esdata1
      o: bind

似乎是docker-compose do not create the folder if it does not exist,但即使在启动 docker 之前创建了文件夹,我总是会收到此错误:

ERROR: for esdata  Cannot create container for service esdata: error while mounting volume with options: type='none' device='./esdata1' o='bind': no such file or directory

注意:这可能很愚蠢,但esdata 是使用命名卷的服务

  esdata:
    ...
    volumes:
      - esdata1:/usr/share/elasticsearch/data
    ...

我在这里缺少什么?

也许./ 的相对路径没有指向执行docker-compose 的文件夹(我尝试使用~/ 使用相对于用户家的文件夹,但我得到了同样的错误)。

提前致谢,

PS:如果我使用绝对路径,它就像一个魅力

【问题讨论】:

  • 你试过sudo吗? sudo docker-comose ?
  • 我刚试过。没有什么。您能分享一下为什么sudo 可能会有所帮助吗?
  • 好吧...也许是权限问题...特别是如果是 MacOs
  • 在服务定义中没有使用相对路径而不是命名卷是否有原因?
  • 仅在多个服务上重复使用该卷。

标签: docker docker-compose


【解决方案1】:

如果您使用这样的命名绑定挂载,则必须包含文件的完整路径,例如:

volumes:
  esdata1:
   driver: local 
   driver_opts:
      type: none
      device: /home/username/project/esdata1
      o: bind

该文件夹也必须预先存在。这就是 linux 绑定挂载系统调用的工作方式,当您传递这样的标志时,您直接与 Linux 对话,无需 docker 或 compose 进行任何路径扩展。

如果你只是想从主机挂载目录,使用主机卷将通过compose扩展为相对路径:

  esdata:
    ...
    volumes:
      - ./esdata1:/usr/share/elasticsearch/data
    ...

虽然由于路径自动扩展,主机卷更易于移植,但您将失去命名卷的功能,其中 docker 使用映像内容(包括文件权限/所有权)初始化一个空的命名卷。

【讨论】:

    【解决方案2】:

    我遇到了完全相同的问题。看来你没有做错什么。这还没有在 Docker 中实现:https://github.com/docker/compose/issues/6343

    便携性不是很好...

    【讨论】:

      猜你喜欢
      • 2019-03-19
      • 2016-07-23
      • 2012-08-29
      • 2011-07-12
      • 2018-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-21
      相关资源
      最近更新 更多