错误:volumes.dbdata必须是映射或null

时间:2018-01-04 08:56:14

标签: docker docker-compose

撰写文件说明:我有一个docker-compose.yml文件,该文件有一个名为' db'的服务。它有一个容量' dbdata'在我的本地计算机上指向' / new / folder'。这将映射到容器' / some / path / to / folder'路径。

以下是我的撰写文件的内容:

version: "3"
services:
  db:
    image: new:1
    volumes:
      - "dbdata:/some/path/to/folder"
    ports:
      - "1234:1234"
    networks:
      - webnet
volumes:
   dbdata: /new/folder

networks:
   webnet:

问题:当我尝试通过发出命令来部署堆栈时:docker stack deploy --compose-file docker-compose.yml service_name,我得到错误为"卷。 dbdata必须是映射或null"。

我也搜索过类似的查询,答案表明在yaml文件中,缩进必须正确。我确保在compose文件中缩进是正确的。我尝试将/ new /文件夹括在双引号内,删除/ new /文件夹之前的额外空格。不幸的是,没有人工作。

问题:为什么错误" volumes.dbdata必须是映射或null"现有?我该如何解决?

3 个答案:

答案 0 :(得分:1)

根据docker volume docs我不认为你可以像这样在docker-compose中映射顶级卷。

  

volumes: dbdata: /new/folder

或者我可能还没有听说过这样的功能,

因此,在我看来,要么您按容器映射您的卷,如: version: "3" services: db: image: new:1 volumes: - db_data: /some/path/to/folder

在您的撰写中创建映射卷,例如:

volumes: db_data: external: name: volume-names

答案 1 :(得分:1)

要将目录映射为主机卷装入,请直接声明源路径而不使用卷名称(这是典型的解决方案):

version: "3"
services:
  db:
    image: new:1
    volumes:
      - "/new/folder:/some/path/to/folder"
    ports:
      - "1234:1234"
    networks:
      - webnet

networks:
   webnet:

或者您可以声明一个绑定装载的命名卷:

version: "3"
services:
  db:
    image: new:1
    volumes:
      - "dbdata:/some/path/to/folder"
    ports:
      - "1234:1234"
    networks:
      - webnet
volumes:
   dbdata:
      driver: local
      driver_opts:
         type: none
         o: bind
         device: /new/folder

networks:
   webnet:

有两个行为差异需要注意。使用命名卷,docker将运行初始化步骤(将图像中的文件和权限复制到空的命名卷中)。但是,要使绑定装置起作用,该目录必须已存在。

答案 2 :(得分:0)

在下面的卷部分中,您只声明卷名称。您可以在此部分添加音量和驱动程序选项,但不要在那里声明映射:

version: "3"
services:
  db:
    image: new:1
    volumes:
      - "dbdata:/some/path/to/folder"
    ports:
      - "1234:1234"
    networks:
      - webnet
volumes:
   dbdata:

networks:
   webnet: