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

rup*_*317 7 docker docker-compose

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:
Run Code Online (Sandbox Code Playgroud)

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

我也搜索了类似的查询,答案表明在 yaml 文件中,缩进必须正确。我确保撰写文件中的缩进正确。我尝试将 /new/folder 括在双引号内,删除 /new/folder 之前的额外空格。不幸的是,没有一个奏效。

问题:为什么存在错误“volumes.dbdata 必须是映射或为空”?我如何解决它?

BMi*_*tch 10

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

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

networks:
   webnet:
Run Code Online (Sandbox Code Playgroud)

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

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:
Run Code Online (Sandbox Code Playgroud)

有两个行为差异需要注意。对于命名卷,docker 将运行初始化步骤(将文件和权限从映像复制到空的命名卷中)。但是,为了使绑定安装正常工作,该目录必须已经存在。