挂载./init初始化PostgreSQL SQL失败,docker-compose卷规格报错
解决
docker-compose up返回invalid volume specification错误 问题场景
运行docker-compose up命令时触发错误:
Error response from daemon: invalid volume specification
当前使用的docker-compose.yaml配置:
version: '3.8' services: nginx: build: context: ./nginx restart: always ports: - "80:80" depends_on: - user_service user_service: build: context: ./user_service restart: always container_name: user_service_container ports: - "8000:8000" depends_on: - user_db environment: DATABASE_URL: postgresql://postgres:1234@user_db:5432/User user_db: image: postgres:16.0 container_name: user_db_container environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: 1234 POSTGRES_DB: User restart: always ports: - "5432:5432" volumes: - ./init/user_service_init.sql:/docker-entrypoint-initdb.d/user_service_init.sql - user_db_data:/var/lib/postgresql/data volumes: user_db_data:
项目根目录结构:
- docker-compose.yaml
- init/
- user_service_init.sql
- nginx/
- user_service/
SQL初始化脚本内容:
CREATE TABLE IF NOT EXISTS users ( id SERIAL PRIMARY KEY, username VARCHAR(100) NOT NULL, password_hashed VARCHAR );
可能的原因及修复方案
1. 执行命令的目录错误
必须在**docker-compose.yaml所在的项目根目录**下运行docker-compose up,否则相对路径./init/user_service_init.sql会被解析到错误位置,导致Docker找不到本地文件。
- 修复:切换到根目录后重新执行命令。
2. 本地文件路径不存在或拼写错误
检查init/user_service_init.sql是否存在,以及路径拼写是否正确:
- 确认
init文件夹和SQL文件在docker-compose.yaml同级目录下; - Linux/macOS系统注意区分大小写,确保文件名和文件夹名完全匹配。
- 修复:如果文件缺失则创建对应文件,或修正路径拼写。
3. Windows系统下Docker磁盘共享未授权
Windows系统中,Docker需要获得磁盘访问权限才能挂载本地文件:
- 打开Docker Desktop设置;
- 进入资源 > 文件共享;
- 勾选
docker-compose.yaml所在的磁盘(如C盘),点击应用; - 重启Docker后重新执行命令。
4. Linux/macOS系统下权限不足
本地init文件夹或SQL文件可能没有足够的读取权限:
- 执行命令赋予可读权限:
chmod -R 755 ./init - 或调整文件所有者:
sudo chown -R $USER:$USER ./init
5. YAML格式问题
检查volumes部分的缩进是否正确,确保每个卷项的缩进与ports等配置同级,无多余空格或制表符。当前配置格式看起来正常,但可重新检查确认。
验证
修改完成后,重新执行:
docker-compose up --build
内容的提问来源于stack exchange,提问作者Abir Ahmed
相关产品推荐
相关产品推荐

