使用Docker Compose创建PostgreSQL数据库失败求助
PostgreSQL容器初始化脚本执行失败(Is a directory错误)解决办法
问题场景
Windows11环境下,通过docker-compose启动PostgreSQL容器时,挂载的init.sql初始化脚本被容器识别为目录,触发报错:
psql:/docker-entrypoint-initdb.d/init.sql: error: could not read from input file: Is a directory
解决步骤
1. 清理旧容器与挂载残留
彻底清理已创建的容器和关联卷,避免旧挂载状态干扰:
docker-compose down -v
2. 验证本地文件有效性
在Windows命令行进入Backend目录,执行命令确认init.sql是文件而非目录:
dir postgresql
输出中需确保init.sql的类型为「文件」,而非<DIR>。
3. 修正Docker-compose配置
端口配置修正
PostgreSQL默认监听端口为5432,原配置中容器内端口写为5444会导致服务无法正常对外提供,需修正:
ports: - 5444:5432 # 宿主机5444端口映射到容器内默认5432端口
补充网络与卷定义
显式声明网络和卷,避免隐式创建的潜在问题:
# 在docker-compose.yml末尾添加 networks: des-erp: driver: bridge volumes: postgres_data:
4. 开启Docker文件共享权限
打开Docker Desktop,进入设置 -> 资源 -> 文件共享,勾选当前存放项目的磁盘(如C盘),保存后重启Docker。
5. (WSL2后端用户)调整文件权限
若使用WSL2作为Docker后端,进入WSL终端切换到项目目录,执行命令赋予脚本可读权限:
chmod 644 postgresql/init.sql
修正后的完整docker-compose.yml
version: '3' services: postgresql: image: postgres:alpine container_name: postgresql networks: - des-erp env_file: - ./postgresql/database.env ports: - 5444:5432 volumes: - ./postgresql/init.sql:/docker-entrypoint-initdb.d/init.sql - postgres_data:/var/lib/postgresql/data networks: des-erp: driver: bridge volumes: postgres_data:
错误原因说明
Windows环境下,若Docker无法正确访问本地挂载的文件(如文件共享未开启、路径解析错误),会自动将容器内的挂载目标创建为目录,导致初始化脚本无法被识别为文件执行。
内容的提问来源于stack exchange,提问作者roderknight
相关产品推荐
相关产品推荐

