如何通过Docker Compose将含YAML配置的文件夹添加至容器?
解决Docker Compose中
services.volumes must be a mapping报错并挂载configs文件夹 你遇到的报错是因为把volumes配置放错位置了——Docker Compose的语法里,volumes不能直接写在顶级的services节点下面,它要么是作为顶级节点定义命名卷,要么是放在某个具体服务(比如你的app或者postgres)的配置块里,用来给这个服务挂载目录/卷。
你的需求是让应用能访问configs/config.yaml,所以正确的做法是把挂载配置放到app服务的配置里,具体修改如下:
修正后的完整docker-compose.yml
version: '3.8' services: postgres: image: postgres:12 restart: always ports: - '5432:5432' volumes: - ./db_data:/var/lib/postgresql/data - ./server/scripts/init.sql:/docker-entrypoint-initdb.d/create_tables.sql env_file: - local.env healthcheck: test: [ "CMD", "pg_isready", "-q", "-d", "devdb", "-U","postgres" ] timeout: 45s interval: 10s retries: 10 app: build: context: ./server/app dockerfile: Dockerfile env_file: - local.env environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres - POSTGRES_DB=devdb # 把挂载配置移到这里!使用相对路径绑定本地configs文件夹到容器内 volumes: - ./configs:/configs # 顶级volumes节点用来定义命名卷,如果你不需要命名卷可以删掉,这里你用的是绑定挂载,所以这个可留可删 volumes: configs:
关键说明:
- 位置修正:原来的
volumes: - /configs:/configs被移动到了app服务的配置块内,这样Docker才知道要给哪个服务挂载目录。 - 路径优化:我把路径改成了
./configs:/configs,这是相对路径(相对于docker-compose.yml所在的目录),能准确挂载你项目根目录下的configs文件夹,而/configs:/configs会挂载宿主机根目录下的configs,大概率不是你想要的。 - 命名卷的作用:你在顶级节点定义的
volumes: configs是命名卷,如果你只是用绑定挂载(本地文件夹映射到容器),这个命名卷其实可以删除,不会影响挂载效果。
这样修改后,启动容器时就不会再报错,你的应用也能在容器内的/configs路径下访问到config.yaml文件了。
内容的提问来源于stack exchange,提问作者Omegon
相关产品推荐
相关产品推荐

