Docker Compose中能否定义可复用卷变量并跨服务共享?
Docker Compose中能否定义可复用卷变量并跨服务共享?
嘿,这个问题我之前踩过坑!你想用YAML锚点来复用卷配置,但碰到的报错是因为**<<:是YAML的映射合并操作符**,它只能用来合并键值对(map),而你的*backend-volumes是一个数组(sequence),直接这么用自然会触发解析错误。不过别担心,有两种简单的方式能实现你想要的复用效果:
方法一:直接复用数组锚点
既然卷本身是数组类型,我们可以直接把锚点定义为数组,然后在服务的volumes字段里把复用的数组和额外的卷项放在一起——YAML会自动把它们合并成一个数组。
修正后的完整配置如下:
x-backend: &backend image: image:1.0 build: context: ./backend restart: always x-backend-volumes: &backend-volumes - ./backend/src:${BACKEND_PATH} - ./backend/entry.sh:/usr/local/bin/entry.sh - ./frontend/src:${FRONTEND_PATH} services: backend_1: <<: *backend volumes: # 直接插入复用的卷数组 *backend-volumes # 添加额外的卷 - ./additional_volume:/additional_volume volumes: frontend_dist_1: {} frontend_nuxt_1: {} frontend_cache_1: {} backend_1_files: {}
方法二:用extends关键字(Compose 3.4+支持)
如果你的Docker Compose版本是3.4及以上,也可以用extends来复用整个基础服务的配置,包括卷,然后在子服务里添加额外的卷:
# 定义基础服务 services: base_backend: image: image:1.0 build: context: ./backend restart: always volumes: - ./backend/src:${BACKEND_PATH} - ./backend/entry.sh:/usr/local/bin/entry.sh - ./frontend/src:${FRONTEND_PATH} backend_1: extends: base_backend # 添加额外卷,会和基础服务的卷合并 volumes: - ./additional_volume:/additional_volume volumes: frontend_dist_1: {} frontend_nuxt_1: {} frontend_cache_1: {} backend_1_files: {}
这两种方法都能帮你实现卷配置的复用,而且不会触发YAML解析错误,你可以根据自己的习惯选一种来用~
备注:内容来源于stack exchange,提问作者Andrius Solopovas
相关产品推荐
相关产品推荐

