撰写文件的描述:我有一个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,我得到的错误是“volumes.dbdata必须是映射或null”。
我也搜索了类似的查询,答案表明在yaml文件中,缩进必须是正确的。我确保在compose文件中缩进是正确的。我尝试将/ new /文件夹括在双引号内,删除/ new /文件夹之前的额外空格。不幸的是,没有人工作
问题:为什么错误“volumes.dbdata必须是映射或null”存在?我如何解决它?
要将目录映射为主机卷装入,请直接声明源路径而不使用卷名称(这是典型的解决方案):
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将运行初始化步骤(将图像中的文件和权限复制到空的命名卷中)。但是,要使bind挂载工作,该目录必须已存在。
根据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
在下面的卷部分中,您只声明卷名称。您可以在此部分添加卷和驱动程序选项,但不要在那里声明映射:
version: "3"
services:
db:
image: new:1
volumes:
- "dbdata:/some/path/to/folder"
ports:
- "1234:1234"
networks:
- webnet
volumes:
dbdata:
networks:
webnet: